在深度全连接神经网络中进行二元分类的反向传播的正确方法是啥
Posted
技术标签:
【中文标题】在深度全连接神经网络中进行二元分类的反向传播的正确方法是啥【英文标题】:What's the proper way to do back propagation in Deep Fully Connected Neural Network for binary classification在深度全连接神经网络中进行二元分类的反向传播的正确方法是什么 【发布时间】:2020-01-18 20:11:45 【问题描述】:我尝试使用 python 和 numpy 实现用于二进制分类的深度全连接神经网络,并使用 Gradient Descent
作为优化算法。
结果证明我的模型严重拟合不足,即使在 1000 个 epochs 之后也是如此。我的损失从未超过 0.69321,我尝试检查我的 权重导数 并立即意识到它们非常小(小至 1e-7) ,如此小的梯度导致我的模型永远不会有更大的梯度下降更新,也永远不会达到全局最小值。我将详细说明前向和后向传播的数学/伪代码,如果我走在正确的轨道上,请告诉我。我将遵循DeepLearning.ai By Andrew Ng
中使用的命名约定。
假设我们有 4 层神经网络,输出层只有 one node
在 0/1 之间进行分类。
X -> Z1 - > A1 - > Z2 - > A2 - > Z3 - > A3 - > Z4 - > A4
Forward propagation
Z1 = W1 dot_product X + B1
A1 = tanh_activation(Z1)
Z2 = W2 dot_product A1 + B2
A2 = tanh_activation(Z2)
Z3 = W3 dot_product A2 + B3
A3 = tanh_activation(Z3)
Z4 = W4 dot_product A3 + B4
A4 = sigmoid_activation(Z4)
Backward Propagation
DA4 = -( Y / A4 + (1 - Y / 1 - A4 ) ) ( derivative of output activations or logits w.r.t to loss function )
DZ4 = DA4 * derivative_tanh(Z4) ( derivative of tanh activation, which I assume is ( 1 - (Z4 ) ^ 2 ) )
Dw4 = ( dZ4 dot_produt A3.T ) / total_number_of_samples
Db4 = np.sum(DZ4, axis = 1, keepdims = True ... ) / total_number_of_samples
DA3 = W4.T dot_product(DZ4)
DZ3 = DA3 * derivative_tanh( Z3 )
DW3 = ( DZ3 dot_product A2.T ) / total_number_of_samples
DB3 = np.sum( DZ3, .. ) / total_number_of_samples
DA2 = W3.T dot_product(DZ3)
DZ2 = DA2 * derivative_tanh( Z2 )
DW2 = ( DZ2 dot_product A1.T ) / total_number_of_samples
DB2 = np.sum( DZ2, .. ) / total_number_of_samples
DA1 = W2.T dot_product(DZ2)
DZ1 = DA1 * derivative_tanh( Z1 )
DW1 = ( DZ1 dot_product X.T ) / total_number_of_samples
DB1 = np.sum( DZ1, .. ) / total_number_of_samples
这是我的 tanh 实现,
def tanh_activation(x):
return np.tanh(x)
我的 tanh 导数实现
def derivative_tanh(x):
return ( 1 - np.power(x,2))
在上述反向传播步骤之后,我使用梯度下降及其各自的导数更新了权重和偏差。但是,无论我运行该算法多少次,该模型都无法将其损失提高到超过0.69
并且输出权重的导数(在我的情况下为dW4
)非常低1e-7
。我假设我的derivative_tanh
函数或dZ
的计算确实关闭了,这导致错误的损失值传播回网络。无论我的反向传播实现是否有效,请分享您的想法。 TIA。我经历了
back propagation gradient descent calculus
和
how to optimize weights of neural network .. 和许多其他博客,但找不到我要找的东西。
【问题讨论】:
【参考方案1】:我找到了解决问题的方法并在此回答:What's the proper way to do back propagtion in deep fully connected neural network。我建议关闭线程。
【讨论】:
以上是关于在深度全连接神经网络中进行二元分类的反向传播的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
深度学习常见概念字典(感知机全连接层激活函数损失函数反向传播过拟合等)