1. 计算机神经网络与神经元

要理解神经网络中的梯度下降算法,首先我们必须清楚神经元的定义。如下图所示,每一个神经元可以由关系式y=f(∑i=1nwixi+b)y = f(\sum_{i=1}^nw_ix_i + b)y=f(∑i=1n​wi​xi​+b)来描述,其中X=[x1,x2,...,xn]X = [x_1,x_2,...,x_n]X=[x1​,x2​,...,xn​]就是N维的输入信号,W=[w1,w2,...,wn]W =[w_1,w_2,...,w_n]W=[w1​,w2​,...,wn​]是与输入向量一一对应的n维权重,bbb bias 偏斜,yyy对应该神经元的输出,fff函数称为激励函数,例如sigmoid函数,softmax函数等等。

那么一个神经网络是如何进行学习的呢?以一个神经元为例,在一组输入信号XXX经过该神经元后,我们得到了一个输出信号称之为yetoiley_{etoile}yetoile​,而训练集中给出的实际输出例如为yyy,那么显而易见地,想要提高正确率,即正确地学习对于一组输入应该获得的输出yyy,一个神经元所做的计算,就是一个最优化(最小化)问题,通过改变权重WWW来最小化损失(误差) l(y,yetoile)l(y,y_{etoile})l(y,yetoile​)。当然,这个误差的定义可以根据问题的不同有所区别,例如简单的向量L1,L2距离,MSE均方误差。对于整个训练集而言,当然不止包含了一组输入输出。因此整体而言,误差Loss Function L(W)=1N∑t=1Kl(yt,ytetoile)L(W) = \frac{1} {N}\sum_{t=1}^{K}l(y_t,y_{t_{etoile}})L(W)=N1​∑t=1K​l(yt​,ytetoile​​) 是所有K组训练数据误差的总和的平均数。

我们已经知道了,Loss Function损失函数与神经元的权重息息相关,神经元要做的计算,就是找到能最小化该损失函数的权重WWW。优化的算法纷繁多样,使用的较为广泛的就是梯度下降gradientdescentgradient\space\space descentgradient  descent 及其衍生算法SGD随机梯度下降,BGD批量梯度下降。

2. 梯度下降算法 gradientdescentgradient\space\space descentgradient  descent

梯度下降算法,一言以蔽之,就是沿着梯度下降的方向不断迭代,最终逼近函数最小值的优化方法。如下图所示,在最小化Loss Function损失函数的过程中,权重总是沿着损失函数梯度下降的方向变化,即wi=wi−λ∇L∣wiw_i = w_i - \lambda\nabla L|_{w_i}wi​=wi​−λ∇L∣wi​​,其中λ\lambdaλ为学习率。当损失函数的梯度接近0时,可以终止迭代。大致理解了梯度下降算法的原理,接下我们看看在优化神经元的过程中,梯度下降算法是如何实现的。

3. backpropagation 反向传播算法

通过上一个部分,我们理解了使权重沿着Loss的梯度下降方向迭代,可以最终最小化损失函数。这个过程中,权重的更新wi=wi−λ∇L∣wiw_i = w_i - \lambda\nabla L|_{w_i}wi​=wi​−λ∇L∣wi​​取决于损失函数的梯度。计算该梯度的最常用方法,就是反向传播算法。反向传播算法其实际原理类似于复合函数导数。我们通过链式法则,可以将所需求的梯度分割成子变量的梯度的乘积。
以单个神经元的神经网络的优化为例:
yetoile=f(∑i=1nwixi+b)y_{etoile} = f(\sum_{i=1}^nw_ix_i + b)yetoile​=f(∑i=1n​wi​xi​+b)

ei=wixie_i = w_ix_iei​=wi​xi​,

v=∑iei+θv=\sum_ie_i+ \thetav=∑i​ei​+θ

默认使用sigmoid激励函数:

yetoile=σ(v)y_{etoile} = \sigma(v)\space\spaceyetoile​=σ(v)   经过激励函数后的输出

σ(v)=11+e−v\sigma(v) = \frac{1}{1+e^{-v}}\space\spaceσ(v)=1+e−v1​   sigmoid函数

ϵ=yetoile−y\epsilon = y_{etoile} - y\space\spaceϵ=yetoile​−y   yetoiley_{etoile}yetoile​与实际值yyy的误差

L=ϵ2L = \epsilon^2L=ϵ2

使用链式法则我们不难得到 :
∂L∂wi=∂L∂ei∂ei∂wiwhere∂ei∂wi=xi\frac{\partial L}{\partial w_i} = \frac{\partial L}{\partial e_i}\frac{\partial e_i}{\partial w_i} \space\space where \space\frac{\partial e_i}{\partial w_i} = x_i ∂wi​∂L​=∂ei​∂L​∂wi​∂ei​​  where ∂wi​∂ei​​=xi​

∂L∂ei=∂L∂v∂v∂eiwhere∂v∂ei=1\frac{\partial L}{\partial e_i} = \frac{\partial L}{\partial v}\frac{\partial v}{\partial e_i} \space\space where \space\frac{\partial v}{\partial e_i} =1 ∂ei​∂L​=∂v∂L​∂ei​∂v​  where ∂ei​∂v​=1

∂L∂v=∂L∂yetoile∂yetoile∂vwhere∂yetoile∂v=σ′(v)=e−v(1+e−v)2\frac{\partial L}{\partial v} = \frac{\partial L}{\partial y_{etoile}}\frac{\partial y_{etoile}}{\partial v} \space\space where \space\frac{\partial y_{etoile}}{\partial v} =\sigma'(v) = \frac{e^{-v}}{(1+e^{-v})^2}∂v∂L​=∂yetoile​∂L​∂v∂yetoile​​  where ∂v∂yetoile​​=σ′(v)=(1+e−v)2e−v​

∂L∂yetoile=∂L∂ϵ∂ϵ∂yetoilewhere∂ϵ∂yetoile=1\frac{\partial L}{\partial y_{etoile}} = \frac{\partial L}{\partial \epsilon}\frac{\partial \epsilon}{\partial y_{etoile}} \space\space where \space\frac{\partial \epsilon}{\partial y_{etoile}} =1 ∂yetoile​∂L​=∂ϵ∂L​∂yetoile​∂ϵ​  where ∂yetoile​∂ϵ​=1

最后,∂L∂ϵ=2ϵ\frac{\partial L}{\partial \epsilon} = 2\epsilon∂ϵ∂L​=2ϵ

通过链式法则,我们将复杂的复合函数的梯度拆解为一个个基础的梯度,他们的乘积就是我们需要的损失函数Loss Function关于权重的梯度:
∇L∣wi=2(ϵ)σ′(v)xi\nabla L|_{w_i} = 2(\epsilon)\sigma'(v)x_i∇L∣wi​​=2(ϵ)σ′(v)xi​

首先对于每个训练集中的数据XXX,以及对应的当前权重WWW,我们首先通过正向传播,计算出各个关键值并储存在内存中。

如下所示,通过正向传播以及各个变量之间的数值关系,我们可以很简单地计算出每次迭代各个变量对应的值。

接着就是反向传播计算梯度的过程了,如下图所示,例如我们有∂L∂ϵ=2ϵ=−1.37∗2=−2.75\frac{\partial L}{\partial \epsilon} = 2\epsilon = -1.37 * 2 = -2.75∂ϵ∂L​=2ϵ=−1.37∗2=−2.75
又有
∂ϵ∂yetoile=1\frac{\partial \epsilon}{\partial y_{etoile}} =1∂yetoile​∂ϵ​=1
因此
∂L∂yetoile=∂L∂ϵ∂ϵ∂yetoile=−2.75\frac{\partial L}{\partial y_{etoile}} = \frac{\partial L}{\partial \epsilon}\frac{\partial \epsilon}{\partial y_{etoile}} = -2.75 ∂yetoile​∂L​=∂ϵ∂L​∂yetoile​∂ϵ​=−2.75


依此类推,我们不难通过链式法则,一步一步反向传播,直到计算出我们最终需求的梯度值: ∂L∂wi\frac{\partial L}{\partial w_i}∂wi​∂L​
理解了梯度下降算法在训练神经元过程中的应用,以及反向传播算法如何计算出复合梯度的过程,接下来分享一个Tensorflow模块中非常好用的计算梯度的类,这大大简化了我们计算反向传播的过程。

4. Tensorflow GradientTape

用几个简单的例子介绍一下功能强大的GradientTape类,可以帮助我们在深度学习中简便地计算函数的梯度。

import tensorflow as tf
with tf.GradientTape(watch_accessed_variables=True) as t:x = tf.Variable(3.0)y = x ** 2# t.watch(x)dy_dx = t.gradient(y,x)print(type(dy_dx))print(dy_dx.numpy())print(dy_dx)

上述代码计算了 y=x2y = x^2y=x2这个函数在x=x=x=
输出结果如下 :

Tensorflow库中的GradientTape类使用简单,其中输入输出都推荐定义为张量tensor的形式,即可训练的变量形式。GradientTape类中的watch_accessed_variables参数决定了类是否会自动观测保存可训练的变量,当这个参数值为False时,我们可以使用 t.watch()方法指定类观察的具体变量。

如下例子,调用t.gradient()方法时,变量也可以是高维的tensor。

w = tf.Variable(tf.random.normal((3,2)),name='w')
b = tf.Variable(tf.zeros(2,dtype=tf.float32),name='b')
x = [[1.,2.,3.]]with tf.GradientTape() as tape:y = x @ w + bloss = tf.reduce_mean(y**2)# 可以用张量的形式同时计算多个变量tensor对应的梯度[dl_dw, dl_db] = tape.gradient(loss,[w,b])print(dl_dw)print(dl_db)

输出结果如下:

以我们在上一部分做的反向传播算法为例 :

with tf.GradientTape() as tape:W = tf.Variable([[-1.,-1.5]])X = tf.Variable([[-3.],[2.]])thelta = tf.Variable(0.5,dtype=tf.float32)y_etoile = tf.sigmoid(W @ X + thelta)y = tf.Variable(2,dtype=tf.float32)loss = (y_etoile - y) ** 2(dl_dx, dl_dw, dl_dthe) = tape.gradient(loss,[X,W,thelta])print(dl_dw)

输出结果如下:

可以看到,我们使用tensorflow计算出的梯度∂L∂wi\frac{\partial L}{\partial w_i}∂wi​∂L​与使用反向传播算法的计算结果是一致的。

一文看懂计算机神经网络与梯度下降相关推荐

  1. 一文看懂卷积神经网络CNN的核心

    在之前,我总结了关于计算机神经网络与梯度下降的核心,详见下文链接 : 一文看懂计算机神经网络与梯度下降 本文主要会对图像相关的机器学习中最为重要的网络,卷积神经网络作个人的理解分析. 1. 为什么要使 ...

  2. 一文看懂NLP神经网络发展历史中最重要的8个里程碑!

    一文看懂NLP神经网络发展历史中最重要的8个里程碑! https://mp.weixin.qq.com/s/gNZiiEfsQjlF9tArNDIt5Q 作者|Sebastian Ruder 译者|小 ...

  3. 一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)

    http://blog.itpub.net/29829936/viewspace-2648775/ 2019-06-25 21:31:18 卷积神经网络 – CNN 最擅长的就是图片的处理.它受到人类 ...

  4. 【深度学习理论】一文看懂卷积神经网络

    [深度学习理论]一文看懂卷积神经网络 https://mp.weixin.qq.com/s/wzpMtMFkVDDH6scVcAdhlA 选自Medium 作者: Pranjal Yadav 经机器之 ...

  5. 一文看懂BP神经网络的基础数学知识

    看懂本文需要的基础知识有: 能够理解最基本的最优化问题(例如最小二乘法优化) 学习过高数和线性代数,对数学符号有概念 一定的编程基础 最好明白感知器的概念 神经网络的基本知识 1.0 历史与发展 线性 ...

  6. 一文看懂循环神经网络-RNN(独特价值+优化算法+实际应用)

    https://www.toutiao.com/a6709772730272580107/ 卷积神经网络 – CNN 已经很强大的,为什么还需要RNN? 本文会用通俗易懂的方式来解释 RNN 的独特价 ...

  7. 入门 | 一文看懂卷积神经网络

    本文选自Medium,主要介绍了神经网络中的卷积神经网络,适合初学者阅读. 概述 深度学习和人工智能是 2016 年的热词:2017 年,这两个词愈发火热,但也更加容易混淆.我们将深入深度学习的核心, ...

  8. 一文看懂卷积神经网络

    本文选自Medium,主要介绍了神经网络中的卷积神经网络,适合初学者阅读. 概述 深度学习和人工智能是 2016 年的热词:2017 年,这两个词愈发火热,但也更加容易混淆.我们将深入深度学习的核心, ...

  9. 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)

    2020-03-06 20:00:00 计算机视觉(Computer Vision)是人工智能领域的一个重要分支.它的目的是:看懂图片里的内容. 本文将介绍计算机视觉的基本概念.实现原理.8 个任务和 ...

最新文章

  1. 如何判断Android手机当前是否联网?
  2. leangoo领歌敏捷工具工作台可查看最近访问脑图和项目
  3. 【转载】linux 下 cpu使用情况分析
  4. 如何采用锂离子电池提高数据中心电源效率
  5. 在SQL SERVER中实现Split功能的函数,并在存储过程中使用
  6. 表面上在帮女朋友拍照,其实镜头瞄准的是......
  7. 为什么你的数据分析成果总是难以落地?
  8. C#用注册表开机自动启动某某软件
  9. ubuntu 13.04安装注意事项和ROOT密码设置
  10. Eclipse环境安装Python插件PyDev
  11. Java小题,通过JNI调用本地C++共享库中的对应方法实现杨辉三角的绘制
  12. bjui—关闭dialog以及当前标签
  13. 手机刷入其它系统跳过谷歌开机引导,谷歌安全验证
  14. 服务器阵列卡装系统蓝屏,电脑开raid做系统蓝屏-电脑开机就蓝屏怎么解决?
  15. 计算机报名照片没有重命名,电脑照片重命名怎么弄
  16. qconshanghai2017
  17. 剑指 Offer 42. 连续子数组的最大和(官解)
  18. SSE(服务器推送事件)的介绍、问题及解决
  19. 计算机网络时间同步技术原理介绍
  20. 神州网信政府版Win10选择“启用文件和打印机共享”之后,无法保存设置的解决办法

热门文章

  1. java 数组处理_JAVA操作数组
  2. mysql sqlsugar_.net core +mysqlSugar(最为简单的增删改查)
  3. python 温度转换程序_Python程序将米转换为码
  4. 在网络中配置思科交换机
  5. longvalue_Java Short类longValue()方法及示例
  6. Java ObjectStreamField toString()方法与示例
  7. Java PushbackInputStream markSupported()方法与示例
  8. python 立方体_Python | 创建三个数字列表,分别是正方形和立方体
  9. uva 10602——Editor Nottoobad
  10. 乘法口诀表的C语言编程