| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 吴恩达深度学习课程-第三周 -> 正文阅读 |
|
[人工智能]吴恩达深度学习课程-第三周 |
1.神经网络概述和表示在下图中,上标 [ 1 ] 、 [ 2 ] [1]、[2] [1]、[2]表示当前神经网络的层数,并不是前面提到的样本个数。 a [ 1 ] a^{[1]} a[1]表示第一层的激活值,图中可以表示为 a [ 1 ] = [ a 1 [ 1 ] 、 a 2 [ 1 ] 、 a 3 [ 1 ] ] T a^{[1]}=[a^{[1]}_1、a^{[1]}_2、a^{[1]}_3]^T a[1]=[a1[1]?、a2[1]?、a3[1]?]T,以此类推。该网络被称为双层神经网络(因为一般不把输入层视为其中一层): 部分细节可以参考吴恩达机器学习课程-第四周中第2节 2.神经网络的输出计算2.1 单个样本的输出对于上述的双层神经网络,输入层到第一层的前向计算过程如下: 如果采用for循环去计算明显效率低下,此时需要将等式向量化。此时将 w w w堆积为 4 ? 3 4*3 4?3的矩阵(每一行可以视为一个神经元的向量表示), b b b则为 4 ? 1 4*1 4?1的向量: 最终整个神经网络可以全部表示为向量运算,其中输入 x x x可以表示为 a [ 0 ] a^{[0]} a[0]: 2.2 多个样本的输出首先明确符号 a [ 2 ] ( i ) a^{{[2]}(i)} a[2](i)中的 ( i ) (i) (i)表示第 i i i个样本, [ 2 ] [2] [2]表示该单元处于神经网络的层数。如果使用for循环去计算训练集所有样本在神经网络中的输出: 进行向量化的话就可以不需要写 ( i ) (i) (i),而是直接将输入 x x x和输出 z 、 a z、a z、a从向量拼接为矩阵: 3.激活函数3.1 激活函数种类在前面使用到的激活函数全是 s i g m o i d sigmoid sigmoid函数,即 σ ( z ) = 1 1 + e ? z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e?z1?,值域在 ( 0 , 1 ) (0,1) (0,1)之间。但有时其他的激活函数效果会更好:
综上所述:
3.2 为什么使用非线性激活函数?假设激活函数使用线性函数 g ( z ) = z g(z)=z g(z)=z,此时 a [ 1 ] = z [ 1 ] = W [ 1 ] x + b [ 1 ] , a [ 2 ] = z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] a^{[1]}=z^{[1]}=W^{[1]}x+b^{[1]},a^{[2]}=z^{[2]}=W^{[2]}a^{[1]}+b^{[2]} a[1]=z[1]=W[1]x+b[1],a[2]=z[2]=W[2]a[1]+b[2],将上面式子结合形成 a [ 2 ] = z [ 2 ] = W [ 2 ] W [ 1 ] x + W [ 2 ] b [ 1 ] + b [ 2 ] = W ′ x + b ′ a^{[2]}=z^{[2]}=W^{[2]}W^{[1]}x+W^{[2]}b^{[1]}+b^{[2]}=W'x+b' a[2]=z[2]=W[2]W[1]x+W[2]b[1]+b[2]=W′x+b′,神经网络只是把输入线性组合再输出,这些隐藏层就失去作用 所以在输出层在某些情况可以使用线性激活函数(比如 y y y输出房价),但是在隐藏层则不行(除非涉及到压缩) 3.3 激活函数的导数
4.神经网络的反向传播对于单层神经网络中单样本的反向传播过程如下所示: 下图为双层神经网络中多个样本和多样本经过反向传播后的梯度: 5.随机初始化逻辑回归把权重初始化为0是可以的(具体原因可参考博文为什么逻辑回归训练时参数可以初始化为0?),但是对于神经网络把参数都初始化为0,则梯度下降将不起作用。如下图所示,如果将 W [ 1 ] W^{[1]} W[1]和 b [ 1 ] b^{[1]} b[1]都初始化为0,则 a 1 [ 1 ] = a 2 [ 1 ] a^{[1]}_1=a^{[1]}_2 a1[1]?=a2[1]?,意味着在反向传播时 d z 1 [ 1 ] = d z 2 [ 1 ] dz_1^{[1]}=dz_2^{[1]} dz1[1]?=dz2[1]?,无论迭代多少次都是如此(隐藏单元再多计算的结果都是一样就毫无意义了): 对于上面的神经网络,一般会进行以下初始化,其中常数 0.01 0.01 0.01是为了避免当激活函数为 t a n h tanh tanh或 s i g m o i d sigmoid sigmoid时, W W W很大会导致 Z Z Z很大,意味着梯度值很小,学习速度就变得很慢: 6.参考https://www.bilibili.com/video/BV1FT4y1E74V?p=25-35 http://www.ai-start.com/dl2017/html/lesson1-week3.html https://blog.csdn.net/qq_41398418/article/details/125106291 https://zhuanlan.zhihu.com/p/149183964 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/26 3:47:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |