反向传播算法的暴力理解
1 Backpropagation 反向传播算法
我们在学习和实现反向传播算法的时候,往往因为其计算的复杂性,计算内涵的抽象性,只是机械的按照公式模板去套用算法。但是这种形式的算法使用甚至不如直接调用一些已有框架的算法实现来得方便。
我们实现反向传播算法,就是要理解为什么公式这么写,为什么这么算。这是非常重要的一件事情!
可能有一些教学会将算法的顺序步骤抽象为一个“反向传播“的过程,将计算转为一种图形或是动画的模式。但在你真正知道为什么这么算之前,这些都是无根之萍。
对于为什么这么算,我们的方法就是正面G。
至于什么是正面G,意思是我们只要理解导数就可以了,其他的所有理解在这里都被摒弃。我们只是计算,用计算来推导公式!
There are no meanings. There are just laws of arithmetic.
下面的文章大多带有英文。提前预警。因为数学公式的使用,建议大屏设备观看。
2 Terminology[1]
-
L = total number of layers in the network
-
= number of units (not counting bias unit) in layer l -
K = number of output units/classes
-
Binary classification: y = 0 or y = 1, K=1;
-
Multi-class classification: K>=3;
Example
- (1) : 第一层向第二层的权重
- 10 :
- 1 :对应第二层的第一个激活单元
- 0 :对应第一层的第0个参数
- 1 :对应第二层的第一个激活单元
3 Feedforward computation
对于上面的4层的神经网络,下面是一个详细的实现算法。要实现反向传播,我们首先要实现前向传播。
前向传播的精髓就是计算一层的输出值,作为下一层的输入值。
3.1 Layer 1
3.2 Layer 2
3.3 Layer 3
3.4 Layer 4
4 Hypothesis expansion
5 对应三个权重矩阵
6 导数部分
单分类:
多分类:
这里我们实现单分类的求导,为了简便我们假设只有一个样本 m = 1
, 多样本没有什么不一样的,就是向量化的一个样本的实现。同时没有 regularization 简化推导。
反向传播就是计算每一个
1 单分类 1x3
2 单分类 2x3
3 单分类 2x3
Tips
我们已经看到,单分类
因此δ是公式上的存档,我们要做的就是。并且只是。首先开解
因为隐藏层的bais unit是一个常数,并不对应下一层的接口。从公式上也可以得出,bais unit的
多分类怎么计算呢?自己想一想吧。
代码示例
这是手写数字数据集的反向传播实践。X
5000张手写数字的400像素灰度图片。两个权重 Theta1 Theta2
.
通过前向传播计算
10分类,3层神经网络。
% ----X = 5000x400; y = 5000x1; Theta1 = 25x401; Theta2 = 10x26----
% ----Feedforward----
a1 = X;
a1 = [ones(m,1) a1]; % 5000x401
z2 = a1 * Theta1'; % 5000x401 401x25
a2 = sigmoid(z2);
a2 = [ones(size(a2,1),1) a2]; %5000x26
z3 = a2 * Theta2'; % 5000x26 26x10
a3 = sigmoid(z3);
% ----Cost By For Loop and Not Regularized----
%for k=1:num_labels,
% y_k = (y==k);
% J = J -(1/m) * (y_k' * log(a3(:,k)) + (1 - y_k') * log(1 - a3(:,k)));
%end
% ----Cost By Matrix and Not Regularized----
% y_K = 5000x10. Notice that " .* ";
y_K = zeros(m, num_labels);
for k=1:num_labels,
y_K(:,k) = (y==k);
end
% First Part Not Regularied
%J = -(1/m) * sum(sum((y_K .* log(a3) + (1 - y_K) .* log(1 - a3))));
Theta1_fix = [zeros(size(Theta1,1),1) Theta1(:,2:end)];
Theta2_fix = [zeros(size(Theta2,1),1) Theta2(:,2:end)];
Theta_fix = [Theta1_fix(:);Theta2_fix(:)];
% Regularied
J = -(1/m) * sum(sum((y_K .* log(a3) + (1 - y_K) .* log(1 - a3)))) + (lambda/(2*m)) * sum(Theta_fix .^2);
gDz2 = sigmoidGradient(z2); % 5000x25
deltaL3 = (a3 .- y_K)'; % 5000*10' = 10*5000
deltaL2 = Theta2' * deltaL3 .* [zeros(size(gDz2,1),1) gDz2]'; % 26*5000 .* 26*5000
% First Part Not Regularied
%Theta2_grad = (1/m) * deltaL3 * a2 ;
%Theta1_grad = (1/m) * deltaL2(2:end,:) * a1 ;
Theta2_grad = (1/m) * deltaL3 * a2 + (lambda/m) * Theta2_fix;
Theta1_grad = (1/m) * deltaL2(2:end,:) * a1 + (lambda/m) * Theta1_fix;
Reference
[1] Andrew NG. Coursera Machine Learning Deep Learning. Cost Function and BackPropagation.
文章会随时改动,要到博客园里看偶。一些网站会爬取本文章,但是可能会有出入。
转载请注明出处哦( ̄︶ ̄)↗
https://www.cnblogs.com/asmurmur/
大模型时代,文字创作已死。2025年全面停更了,世界不需要知识分享。
如果我的工作对您有帮助,您想回馈一些东西,你可以考虑通过分享这篇文章来支持我。我非常感谢您的支持,真的。谢谢!
作者:Dba_sys (Jarmony)
转载以及引用请注明原文链接:https://www.cnblogs.com/asmurmur/p/15558092.html
本博客所有文章除特别声明外,均采用CC 署名-非商业使用-相同方式共享 许可协议。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析