神经网络的前向与后向传播简单理解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络的前向与后向传播简单理解相关的知识,希望对你有一定的参考价值。
参考技术A 正向传播相关函数与概念理解sigmoid激活函数:
产生的原因,将线性的结果非线性化,转化到0~1之间。
计算公式:
说明:x为变量
Softmax函数
产生原因将输出的各个元素为0~1之间的实数,这些元素全部加起来为1.
计算公式:
损失函数的一个类型,表达模型好坏的一个参数,越小越好:
交叉熵:
分类类别-logt 概率,多个输入,则分类类别-logt 概率的平均值
上图为函数的曲线表示,已知t均小于1,所以t越大,logt越大,- logt越小,则接近于0。
反向传播相关函数与概念理解
反向传播发的关键是链式法则,链式法则是复合函数的求导法则,复合函数即多个函数构成的函数。
反向传播算法简单来说就是采用前层神经元对后层神经元的影响大小*学习率来更新权重信息,新权重值=权重值-影响大小*学习率
神经网络中 2 个隐藏层的反向传播和前向传播
【中文标题】神经网络中 2 个隐藏层的反向传播和前向传播【英文标题】:Back-propagation and forward-propagation for 2 hidden layers in neural network 【发布时间】:2019-07-04 14:14:34 【问题描述】:我的问题是关于当隐藏单元的数量大于 1 时深度神经网络的前向和后向传播。
如果我只有一个隐藏层,我知道我必须做什么。在单个隐藏层的情况下,如果我的输入数据X_train
具有n
样本,具有d
的特征数量(即X_train
是(n, d)
维矩阵,y_train
是(n,1)
维矩阵向量),如果我的第一个隐藏层中有h1
隐藏单元的数量,那么我使用Z_h1 = (X_train * w_h1) + b_h1
(其中w_h1
是具有随机数条目的权重矩阵,其形状为(d, h1)
和b_h1
是形状为(h1,1)
的偏置单元。我使用sigmoid 激活A_h1 = sigmoid(Z_h1)
并发现A_h1
和Z_h1
的形状为(n, h1)
。如果我有t
的输出单元数量,那么我使用权重矩阵w_out
尺寸为(h1, t)
和b_out
形状为(t,1)
得到输出Z_out = (A_h1 * w_h1) + b_h1
。从这里我可以得到A_out = sigmoid(Z_out)
形状为(n, t)
。 如果我在第一个隐藏层之后和输出层之前有一个第二个隐藏层(具有 h2 个单元),那么我必须在前向传播中添加哪些步骤以及应该修改哪些步骤?
我还知道在单隐藏层神经网络的情况下如何处理反向传播。对于上一段中的单个隐藏层示例,我知道在第一个反向传播步骤(output layer -> hidden layer1)
中,我应该做Step1_BP1: Err_out = A_out - y_train_onehot
(这里y_train_onehot
是y_train
的onehot 表示。Err_out
具有形状@987654352 @.紧随其后的是Step2_BP1: delta_w_out = (A_h1)^T * Err_out
和delta_b_out = sum(Err_out)
。符号(.)^T
表示矩阵的转置。对于第二个反向传播步骤(hidden layer1 -> input layer)
,我们执行以下Step1_BP2: sig_deriv_h1 = (A_h1) * (1-A_h1)
。这里sig_deriv_h1
的形状为@987654359 @. 在下一步中,我执行Step2_BP2: Err_h1 = \Sum_i \Sum_j [ ( Err_out * w_out.T)_i,j * sig_deriv_h1__i,j )
]。这里,Err_h1
的形状为 (n,h1)
。在最后一步中,我执行 Step3_BP2: delta_w_h1 = (X_train)^T * Err_h1
和 delta_b_h1 = sum(Err_h1)
。如果我应该添加哪些反向传播步骤我在第一个隐藏层之后和输出层之前有一个第二个隐藏层(h2 个单元)?我应该修改我在这里描述的一个隐藏层案例的反向传播步骤吗?
【问题讨论】:
你在做什么? TensorFlow/numpy 还是别的什么? 我正在尝试以 ab initio 方式编写前向和后向传播步骤(即不使用 tensorflow 或任何包。) 这是 coursera 的深度学习模块中的内容,根据 Coursera 协议中的行为准则,我不允许上传其中的部分代码,但很多人已经上传到了 GitHub,这里是同一github.com/enggen/Deep-Learning-Coursera/blob/master/…上的一个链接 【参考方案1】:● 令X为形状为(n, d)
的样本矩阵,其中n
表示样本数,d
表示特征数。
● 让 wh1 为权重矩阵 - 形状为 (d, h1)
,并且
● 令bh1 为形状(1, h1)
的偏置向量。
向前和向后传播需要以下步骤:
► 正向传播:
⛶ 第 1 步:
Zh1 = [ X • wh1 ] + bh1
↓ ↓ ↓ ↓
(n,h1)
(n,d)
(d,h1)
(1,h1)
这里,符号 • 表示矩阵乘法,h1
表示第一个隐藏层中隐藏单元的数量。
⛶ 第 2 步:
让 Φ() 为激活函数。我们明白了。
ah1 = Φ (Zh1)
↓ ↓
(n,h1)
(n,h1)
⛶ 第 3 步:
获得新的权重和偏差:
● wh2 形状为(h1, h2)
,和
● bh2 形状为(1, h2)
。
⛶ 第 4 步:
Zh2 = [ ah1 • wh2 ] + bh2
↓ ↓ ↓ ↓
(n,h2)
(n,h1)
(h1,h2)
(1,h2)
这里,h2
是第二个隐藏层中隐藏单元的数量。
⛶ 第 5 步:
ah2 = Φ (Zh2)
↓ ↓
(n,h2)
(n,h2)
⛶ 第 6 步:
获得新的权重和偏差:
● wout 形状为(h2, t)
,并且
● bout 形状为(1, t)
。
这里,t
是类的数量。
⛶ 第 7 步:
Zout = [ ah2 • wout ] + bout
↓ ↓ ↓ ↓
(n,t)
(n,h2)
(h2,t)
(1,t)
⛶ 第 8 步:
aout = Φ (Zout)
↓ ↓
(n,t)
(n,t)
► 反向传播:
⛶ 第 1 步:
构造唯一输出类的 one-hot 编码矩阵 (yone-hot)。
错误out = aout - yone-hot
↓ ↓ ↓
(n,t)
(n,t)
(n,t)
⛶ 第 2 步:
Δwout = η (ah2T • 错误out )
↓ ↓ ↓
(h2,t)
(h2,n)
(n,t)
Δbout = η [ ∑ i=1n (错误out,i) ]
↓ ↓
(1,t)
(1,t)
这里η是学习率。
wout = wout - Δwout (权重更新。)
bout = bout - Δbout (偏差更新。)
⛶ 第 3 步:
错误2 = [错误out • woutT] ✴ Φ / (ah2)
↓ ↓ ↓ ↓
(n,h2)
(n,t)
(t,h2)
(n,h2)
这里,符号 ✴ 表示逐元素矩阵乘法。符号 Φ/ 表示 sigmoid 函数的导数。
⛶ 第 4 步:
Δwh2 = η (ah1T • 错误2 )
↓ ↓ ↓
(h1,h2)
(h1,n)
(n,h2)
Δbh2 = η [ ∑ i=1n (错误2,i) ]
↓ ↓
(1,h2)
(1,h2)
wh2 = wh2 - Δwh2 (权重更新。)
bh2 = bh2 - Δbh2 (偏差更新。)
⛶ 第 5 步:
错误3 = [错误2 • wh2T] ✴ Φ / (ah1)
↓ ↓ ↓ ↓
(n,h1)
(n,h2)
(h2,h1)
(n,h1)
⛶ 第 6 步:
Δwh1 = η ( XT • 错误3 )
↓ ↓ ↓
(d,h1)
(d,n)
(n,h1)
Δbh1 = η [ ∑ i=1n (错误3,i) ]
↓ ↓
(1,h1)
(1,h1)
wh1 = wh1 - Δwh1 (权重更新。)
bh1 = bh1 - Δbh1 (偏差更新。)
【讨论】:
【参考方案2】:对于前向传播,第一个隐藏层的输出维度必须与第二个输入层的维度相匹配。
如上所述,您的输入具有维度(n,d)
。隐藏层 1 的输出将具有(n,h1)
的维度。所以第二个隐藏层的权重和偏差必须分别为(h1,h2)
和(h1,h2)
。
所以w_h2
的维度为(h1,h2)
,b_h2
的维度为(h1,h2)
。
输出层的权重和偏差的维度将为w_output
,维度为(h2,1)
,b_output
的维度为(h2,1)
。
你必须在反向传播中重复同样的事情。
【讨论】:
大黄蜂:谢谢你的回答。我现在更好地理解了第二层的前向传播步骤。偏差b_h2
应该是尺寸(h2, 1)
而不是(h1, h2)
?另外,你能更详细地描述一下反向传播步骤吗?当我有两个隐藏层时,我对反向传播应该做什么感到困惑。
偏差不应该是(h2,1)
的维度,因为你是通过w_h2
的乘法和隐藏层1的输出来添加偏差。乘法的维度是@ 987654338@。为了添加,偏差也应该是相同的维度。这就是为什么它的维度为(h1,h2)
对于反向传播,您将在所有的转置中反向执行相同的操作。以上是关于神经网络的前向与后向传播简单理解的主要内容,如果未能解决你的问题,请参考以下文章
计算梯度:网络的前向与反向传播 和 优化方法:更新模型参数的方法