反向传播算法和Tensorflow代码实现

目录

概述

推导

loss函数是MSE

 loss函数是交叉熵

神经网络迭代

前向传播

反向传播


概述

        反向传播算法是深度学习的优化算法,主要应用的是链式求导法则去求得每个层的参数的梯度,从而反向的更新梯度,神经网络的一次迭代包含了一次前向传播和一次反向传播。本文将包含反向传播的推导,依据代码和具体数值来诠释神经网络的一次迭代。

推导

为了图片清晰,部分神经元的连接没有在图片中展示:

loss函数是MSE

MSE损失函数:

loss=\frac{1}{2m}\sum_{i=1}^{m}(f_{3(i)}-y_i)^2

当loss函数是MSE,则f_3=z_1^{(2)}未做非线性变换,假设f_1,f_2是sigmoid函数,故而有:

 loss函数是交叉熵

  • 二分类交叉熵

loss=-\frac{1}{m}\sum_{i=1}^{m}y_i\log{f_{3(i)}}+(1-y_i)\log{(1-f_{3(i)})}

  • 多分类交叉熵

 loss=-\frac{1}{m}\sum_{i=1}^{m}\sum_{j=1}^{k}y_{ij}\log{f_{3(ij)}}

如果是二分类,f_3是sigmoid函数,同时假设激活函数f_1,f_2是sigmoid函数,有:

多分类的的链式求导表达式与MSE和二分类交叉熵一致,由于多分类假设服从的是多项式分布,二分类假设分布服从二项分布,线性回归的残差假设服从的是正太分布,它们都是指数族分布

神经网络迭代

        为方便数值计算,降低计算复杂度,只使用一条样本计算梯度,如果是多条样本,梯度就等于所有样本梯度的加和。损失函数是MSE,f_1,f_2是sigmoid函数

前向传播

反向传播

  • 计算梯度

依据上面推导的公式有:

\frac{\partial loss}{\partial \omega_{11}^{(2)}}=(3.5-5)*0.5=-0.75

\frac{\partial loss}{\partial \omega_{11}^{(1)}}=(3.5-5)*3*[(1-\frac{1}{1+e^0})*\frac{1}{1+e^0}]*1=-1.125

  • 梯度更新

依据 \omega=\omega-\eta*gradient,即可更新梯度

  • 代码验证梯度计算
import tensorflow as tf
import numpy as np

X = tf.expand_dims(np.array([1., 2., 3.]), axis=0)
# X = tf.reshape(tf.range(1, 7, dtype=tf.double),shape=(2, 3))
y = tf.constant([5], dtype=tf.double)

# 第一层theta
theta_1 = tf.Variable(tf.convert_to_tensor(np.zeros((3, 2)), dtype=tf.double))
print("初始theta_1:\n{}".format(theta_1))
# 第二层theta
theta_2 = tf.Variable(tf.convert_to_tensor(np.arange(3, 5).reshape(2, 1), dtype=tf.double))
print("初始theta_2:\n{}".format(theta_2))

with tf.GradientTape() as tape:
    # 第一层前向传播
    y_hat = tf.sigmoid(tf.matmul(X, theta_1))
    print('第一层前向传播:\n{}'.format(y_hat))
    # 第二层前向传播
    y_hat = tf.matmul(y_hat, theta_2)
    print('第二层前向传播:\n{}'.format(y_hat))

    # mse loss
    loss = tf.reduce_mean(tf.square(y - y_hat)) / 2
    print('MSE:\n{}'.format(loss))

    # 求梯度
    gradients = tape.gradient(loss, [theta_2, theta_1])
    print('gradients:\n{}'.format(gradients))

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值