要实现的部分为:forward prop, softmax函数的cost function,每一层的gradient,以及penalty cost和gradient。

  • forwad prop

forward prop是输入sample data,使sample data通过神经网络后得到神经网络输出的过程。

以分类问题来说,不同层的输入和输出如下表所示:

输入 输出
输入层 sample data feature map
隐藏层 feature map feature map
输出层 feature map probabilities of each potential class

所以输入层的输出是sigmoid(W1X+b1),隐藏层的输出是sigmoid(Wlzl-1+bl),而输出层的输出是最终的概率:exp(Wz+b)。代码如下

 %% forward prop
%%% YOUR CODE HERE %%%
%隐藏层 for l = 1:numHidden
if(l == 1)
z = stack{l}.W * data;
else
z = stack{l}.W * hAct{l-1};
end
z = bsxfun(@plus,z,stack{l}.b);%%z:256*60000 b:256*1
hAct{l} = 1./(1+exp(-z));
end
%输出层
h = exp(bsxfun(@plus,stack{numHidden+1}.W * hAct{numHidden},stack{numHidden+1}.b));
pred_prob = bsxfun(@rdivide,h,sum(h,1));
hAct{numHidden+1} = pred_prob;%最后一层输出的实际上是预测的分类结果
  • softmax函数的cost function

这一步和之前的softmax差别在教程中说的很清楚了:“Note that instead of making predictions from the input data x the softmax function takes as input the final hidden layer of the network”。即分类器的输入不是input data,而是最后一层隐藏层输出的feature map,所以softmax函数的cost function如下:

红框中的h就是输出层输出的概率向量pred_prob。代码如下,细节课参见原始的softmax

 %% compute cost计算softmax函数的损失函数
%%% YOUR CODE HERE %%%
logp = log2(pred_prob);
index = sub2ind(size(logp),labels',1:size(pred_prob,2));
ceCost = -sum(logp(index));
  • 计算每一层的gradient

BP(BackPropagation)算法方便的计算了每一层的对应的梯度

其中a是l层的激励(wx+b),δ是每一层的error。

这个公式个人认为有问题,正确的公式应该是:

也就是说l层的W由l-1层的激励和l层的error得到,而不是上述l层的激励和l+1层的error。同样的,cost function对b的导数也应该由下述公式得到:

即由l层的error得到,而不是l+1层的error得到。后面代码实现的时候也是根据这两个公式。

也有可能是我理解错了,欢迎大神指出~详细的推倒过程可以参见这里

对于输出层,我们很容易用groun_truth_label - output的方式计算error,而对于隐藏层,则要用下面的公式计算error:

δ= Wδl+1 * f'(zl)

其中z是wx+b,f是sigmoid函数,这个函数有一个很好的性质就是:f'(x) = f(x) * (1-f(x)), 计算起来非常方便。代码如下:

 %% compute gradients using backpropagation

 %%% YOUR CODE HERE %%%
%输出层
output = zeros(size(pred_prob));
output(index) = 1;
error = pred_prob - output; for l = numHidden+1 : -1 :1
gradStack{l}.b = sum(error,2);
if(l == 1)
gradStack{l}.W = error * data';
break;
else
gradStack{l}.W = error * hAct{l-1}';
end
error = (stack{l}.W)'*error .* hAct{l-1} .* (1-hAct{l-1});%此处的error对应是l-1层的error
end
  • 计算penalty cost和gradient

这里主要是为了防止过拟合,所以对w加了一个正则项。最终的cost function由误差和对w约束的正则项共同组成,cost function对w的导数中也多了一项正则项对w的求导,代码如下:

%% compute weight penalty cost and gradient for non-bias terms
%%% YOUR CODE HERE %%%
%penalty cost
wCost = 0;
for l = 1:numHidden+1
wCost = wCost + 0.5*ei.lambda * sum(stack{l}.W(:) .^ 2);
end
cost = ceCost + wCost; %gradient for non-bias terms
for l = numHidden:-1:1
gradStack{l}.W = gradStack{l}.W + ei.lambda * stack{l}.W;
end

参考资料:

[1]http://neuralnetworksanddeeplearning.com/chap2.html

[2]http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/

[3]http://blog.csdn.net/lingerlanlan/article/details/38464317

最新文章

  1. vert.x学习(七),使用表单获取用户提交的数据
  2. eclipse新建文件模板默认charset=ISO-8859-1解决
  3. UGUI之布局的使用
  4. 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
  5. java的Random
  6. [转]编译Android源代码常见错误解决办法
  7. TMS320C54x系列DSP的CPU与外设——第8章 流水线
  8. win32 汇编打造 wget 体积3kb
  9. 【tarjan】BZOJ 1051:受欢迎的牛
  10. 文本去重之SimHash算法
  11. 在Android Studio中进行单元测试和UI测试
  12. WindowsForm 计算器
  13. ie的selectNodes函数和firefox的document.evaluate
  14. teamviewer无法启动
  15. 浏览器抓包(post)
  16. CSS常用属性计算原理
  17. 移动端H5地图离线瓦片方案
  18. 深度学习与NLP简单应用
  19. 关于<软件>的定义
  20. Gradle构建Java工程配置详解

热门文章

  1. python import错误 SyntaxError: invalid syntax
  2. (转)java Exception层次结构详解
  3. css !import
  4. Unity中内嵌网页插件UniWebView使用总结
  5. 下载VMware
  6. NSTimer的循环引用
  7. CentOS 7安装与配置jdk-8u162
  8. LeetCode-Pathcing Array
  9. [Algorithms] Heap and Heapsort
  10. form.submit 方法 并不会触发 form.onsubmit 事件