IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 《机器学习》学习笔记5:神经网络与反向传播 -> 正文阅读

[人工智能]《机器学习》学习笔记5:神经网络与反向传播

Week5 神经网络与反向传播
基于吴恩达《机器学习》课程
参考黄海广的笔记
本篇博客为第五周的内容。


W5 神经网络 反向传播

9 神经网络的学习(Neural Networks: Learning)

新符号标记:

m代表训练样本的数量,每个包含一组输入向量 x x x和一组输出向量 y y y

L L L表示神经网络的层数;

S l S_l Sl?表示第 l l l层神经元的个数(不包括偏置单元);

K K K表示输出层单元的个数(即分类的类数、输入向量的维数), k k k代表第 k k k个单元。

9.1 神经网络的代价函数

在逻辑回归中,输出值 h θ ( x ) h_\theta \left( x \right) hθ?(x)只有一个,一组训练集中也只有一个 y y y。代价函数为:

J ( θ ) = 1 m ∑ i = 1 m [ ? y ( i ) log ? ( h θ ( x ( i ) ) ) ? ( 1 ? y ( i ) ) log ? ( 1 ? h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}+\frac{\lambda }{2m}\sum\limits_{j=1}^{n}{\theta _{j}^{2}} J(θ)=m1?i=1m?[?y(i)log(hθ?(x(i)))?(1?y(i))log(1?hθ?(x(i)))]+2mλ?j=1n?θj2?

但是在神经网络中有很多输出变量,即 h θ ( x ) h_\theta(x) hθ?(x)和一组训练集中的 y y y是一个维度为 K K K的向量,因此我们的代价函数会比逻辑回归更加复杂一些:

J ( Θ ) = ? 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) log ? ( h Θ ( x ( i ) ) ) k + ( 1 ? y k ( i ) ) log ? ( 1 ? ( h Θ ( x ( i ) ) ) k ) ] + λ 2 m ∑ l = 1 L ? 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{K} {y_k}^{(i)} \log {(h_\Theta(x^{(i)}))}_k + \left( 1 - y_k^{(i)} \right) \log \left( 1- {\left( h_\Theta \left( x^{(i)} \right) \right)_k} \right) \right] + \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^2 J(Θ)=?m1?[i=1m?k=1K?yk?(i)log(hΘ?(x(i)))k?+(1?yk(i)?)log(1?(hΘ?(x(i)))k?)]+2mλ?l=1L?1?i=1sl??j=1sl+1??(Θji(l)?)2

其中: ∑ k = 1 K \sum\limits_{k=1}^{K} k=1K?代表将K个输出单元每一个的代价函数都加起来;正则化项 λ 2 m ∑ l = 1 L ? 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^2 2mλ?l=1L?1?i=1sl??j=1sl+1??(Θji(l)?)2表示每一层 Θ \Theta Θ矩阵参数的平方和(排除偏置 θ 0 \theta_0 θ0?后), i i i循环每层中的所有列(由本层 S l S_l Sl?层激活单元数决定), j j j循环每层中的所有行(由下一层 S l + 1 S_{l+1} Sl+1?层激活单元数决定)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhN4bP9u-1633276054502)(image/IMG_2995.png)]

9.2 反向传播算法(Backpropagation Algorithm)

这里吴恩达老师讲得不是很清楚,详细过程和推导见我上一篇博客:
《〈机器学习〉学习笔记4.9:反向传播(BP算法)详解》

在第四周的神经网络概述中,我们采用了一种正向传播方法。现在,为了最小化代价函数,需要计算代价函数的偏导数 ? ? Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta^{(l)}_{ij}}J\left(\Theta\right) ?Θij(l)???J(Θ),这时就要采用反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。

j j j 代表目前计算层中的激活单元的下标,也将是下一层的第 j j j个输入变量的下标。

i i i 代表下一层中误差单元的下标,是受到权重矩阵中第 i i i行影响的下一层中的误差单元的下标。

具体过程如下:

对于某一组训练数据 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i))

首先第一层的激活值 a ( 1 ) = x ( i ) a^{(1)}=x^{(i)} a(1)=x(i),使用正向传播算法,计算出每一层的加权和 z ( l ) z^{(l)} z(l)和激活值 a ( l ) a^{(l)} a(l)

然后利用最后一层的激活值 a ( L ) a^{(L)} a(L)和训练数据中的 y ( i ) y^{(i)} y(i)计算最后一层误差 δ ( L ) = a ( L ) ? y ( i ) \delta^{(L)}=a^{(L)}-y^{(i)} δ(L)=a(L)?y(i)

利用以下公式计算前一层的误差: δ ( L ? 1 ) = ( Θ ( L ? 1 ) ) T δ ( L ) ? g ′ ( z ( L ? 1 ) ) \delta^{(L-1)}=\left({\Theta^{(L-1)}}\right)^{T}\delta^{(L)}\ast g'\left(z^{(L-1)}\right) δ(L?1)=(Θ(L?1))Tδ(L)?g(z(L?1))

g g g为逻辑函数, g ′ ( z ( L ? 1 ) ) = a ( L ? 1 ) ? ? ( 1 ? a ( L ? 1 ) ) g'(z^{(L-1)})=a^{(L-1)}·*(1-a^{(L-1)}) g(z(L?1))=a(L?1)??(1?a(L?1))

继续求前一层误差,直到到第二层。

(实际上 l l l层误差第 j j j δ j ( l ) = ? C ? z j ( l ) \delta^{(l)}_j=\frac{\partial C}{\partial {z^{(l)}_j}} δj(l)?=?zj(l)??C?,假设 λ = 0 λ=0 λ=0,即我们不做任何正则化处理时有: ? ? Θ i j ( l ) J ( Θ ) = a j ( l ) δ i l + 1 \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=a_{j}^{(l)} \delta_{i}^{l+1} ?Θij(l)???J(Θ)=aj(l)?δil+1?

所有训练数据 的加起来即为 ? ? Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) ?Θij(l)???J(Θ),再用梯度下降或其他优化方法即可。
在这里插入图片描述

9.3 梯度检验

对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度检验Numerical Gradient Checking )方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

在代价函数上对于某个特定的**实数 ** θ \theta θ,沿着切线的方向,我们计算出在 θ ? ε \theta-\varepsilon θ?ε 处和 θ + ε \theta+\varepsilon θ+ε 的代价值( ε \varepsilon ε是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ \theta θ 处的代价值,即:

? J ( θ ) ? θ 1 = J ( θ + ε ) ? J ( θ ? ε ) 2 ε \frac{\partial J(\theta)}{\partial\theta_1}=\frac{J\left(\theta+\varepsilon\right)-J \left( \theta-\varepsilon \right)}{2\varepsilon} ?θ1??J(θ)?=2εJ(θ+ε)?J(θ?ε)?

θ \theta θ是一个向量,则需要计算偏导数来检验:

? J ( θ ) ? θ 1 = J ( θ 1 + ε 1 , θ 2 , θ 3 . . . θ n ) ? J ( θ 1 ? ε 1 , θ 2 , θ 3 . . . θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_1}=\frac{J\left(\theta_1+\varepsilon_1,\theta_2,\theta_3...\theta_n \right)-J \left( \theta_1-\varepsilon_1,\theta_2,\theta_3...\theta_n \right)}{2\varepsilon} ?θ1??J(θ)?=2εJ(θ1?+ε1?,θ2?,θ3?...θn?)?J(θ1??ε1?,θ2?,θ3?...θn?)?

? J ( θ ) ? θ 2 = J ( θ 1 , θ 2 + ε 2 , θ 3 . . . θ n ) ? J ( θ 1 , θ 2 ? ε 2 , θ 3 . . . θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_2}=\frac{J\left(\theta_1,\theta_2+\varepsilon_2,\theta_3...\theta_n \right)-J \left( \theta_1,\theta_2-\varepsilon_2,\theta_3...\theta_n \right)}{2\varepsilon} ?θ2??J(θ)?=2εJ(θ1?,θ2?+ε2?,θ3?...θn?)?J(θ1?,θ2??ε2?,θ3?...θn?)?

. . . . . . ...... ......

最后将梯度检验计算的结果与反向传播计算的结果进行比较,看是否得到相似的值。

检验完后运行梯度下降时,需要关闭梯度检验,因为求偏导计算量过大,每此都求会运行速度极慢。而反向传播则是计算梯度的高效算法。

9.4 随机初始化参数

初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。

如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都相同的数,结果也是一样的。

所以我们通常初始参数为正负 ε ε ε之间的随机值(0-1随机值 × 2 ε ? ×2ε- ×2ε? ε ε ε),例如10×11的参数矩阵:

Theta1 = rand(10, 11) * (2*eps) – eps

9.5 神经网络总结

使用神经网络时的步骤:

选择网络结构:

即决定选择多少层以及决定每层分别有多少个单元。第一层的单元数即我们训练集的特征数量,最后一层的单元数是我们训练集的结果的类的数量。

如果隐藏层数大于1,确保每个隐藏层的单元个数相同 ,最好为第一层个数整数倍,通常情况下隐藏层单元的个数越多越好,但太多会增加计算量。

训练神经网络:

  1. 参数的随机初始化

  2. 利用正向传播方法计算所有的激活值 h θ ( x ) h_{\theta}(x) hθ?(x)

  3. 编写计算代价函数 J ( θ ) J(\theta) J(θ) 的代码

  4. 利用反向传播方法计算所有偏导数(可用循环或向量方式)

  5. 利用数值检验方法(如梯度检验)检验这些偏导数

  6. 使用优化算法(如梯度下降)来最小化代价函数

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:51:04  更:2021-10-04 12:51:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 10:29:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码