【吴恩达】神经网络&深度学习-学习笔记【一】
神经网络-深度学习 - 吴恩达 - 第一课
一、基础介绍
1.1 神经网络-监督学习

神经网络建立模型(监督学习)
1.2 监督学习分类:
1.标准神经网络(NN)- 一般模型
2.卷积神经网络(CNN)- 图像
3.循环神经网络 (RNN) - 音频
4. 混合神经网络 - 复杂系统
- 结构化数据/非结构化数据
结构化:房价预测模型中的数据,都有其特定的含义,比如房屋尺寸,房间数量等
非结构化数据:音频,视频,图像
神经网络既可以学习结构化数据,也可以学习非结构化数据。
- 神经网络发展的原因

二、线性回归
2.1 训练集:
- 一般用m代表:
- 标签集:
2.2 logistic线性回归:
在一些书中可能把b省略,直接结合在w内。
-
线性回归误差函数(Loss/error function):
误差函数,平方差,判断预测值y和实际值y的差距:
实际应用中,选择的是上面这种误差(损失)函数,只适用于单个样本:

PS: 这个log函数是怎么出来的?

成本函数,可以描述一整个训练集:

PS: 这个成本函数是怎么出来的?
(log累乘等于拆开累加)

训练的目的——找到合适的 w,b 使成本函数足够小,达到训练的目的。
- 梯度下降法:

因为成本函数是一个凸函数(sigmoid),只有一个最优解,在三维空间中,通过梯度下降法求最优解。
三维空间不好算,先看一个轴:

通过右边的梯度下降算法,可以看到右边减掉正的斜率,左边减掉负的斜率,就知道下一步更新的方向在什么位置。
将其拓展到二维:
就可以得到两个 w,b 的梯度下降
2.3 计算图:
前向传播 -> 直接代数
反向传播 -> 求导数
关于单个样本的梯度下降法:

多个样本的梯度下降法:

本质上就是一次次计算dw1,dw2,db

2.4 向量化处理数据:

import time
a = np.random.rand(10000000)
b = np.random.rand(10000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
print(c)
print("Vectorized version:"+str(1000*(toc-tic))+"ms")
c = 0;
tic = time.time()
for i in range(1000000):
c+=a[i]*b[i]
toc = time.time()
print(c)
print("For loop:"+str(1000*(toc-tic))+"ms")
CPU 和 GPU 都有并行指令,使用np.function 可以调用向量化指令,并行运算提高速度。
当需要使用向量化中的exp时,只需要np.exp即可
向量化其实就是转换成并行计算
-
向量化在线性回归中的应用:
目的:消除for循环
向量化 dz ,得到 A 向量化后的矩阵

再把梯度计算也加上:
向量化 db ,直接用sum的dz求和后除m。向量化dw,dw中的X矩阵是一个样本矩阵,行是同一特征的不同样本,列是不同特征,共用dz

- Python广播计算:

Python广播很灵活,但是也很容易引入新错误,因此需要注意:
定义向量的时候,要注意不要直接用rank定义,要用行、列定义
三、神经网络
3.1 基础模型
用上标表示是哪一个层:

神经网络的层数:隐含层数+输出层(不包含输入层):

x为输入特征,a为激活函数。
在这里w[1]为一个4X3矩阵,b[1]为一个4X1矩阵,因为输入有x1,x2,x3三个特征,因此w对每一个节点是一个3X1矩阵,四个拼起来取转置就是4X3了。
输出层同理,w[2]为4x1的矩阵, 因为隐含层有四个特征,b[2]为1x1的矩阵。
四个隐含单元的计算:

向量化可以加速计算。
然后是整体的双层神经网络的计算:
输入x(也可以看做a[0]),算z[1], 然后代入激活函数求a[1]。
接下来算z[2], 把前面的a[1] 当成输入,计算出z[2]后带入激活函数求a[2],得到最终输出。
如果输入多样本的话,则:
对其向量化后,可得:
3.2 激活函数
-
sigmoid函数:
介于 0~1 之间
缺点:当z数值很小或者很大时候,斜率很小,拖慢学习速度。
适用:输出值为0和1,做二元分类时候适合做输出层激活函数,其他层用ReLU
-
tanh函数(通常更优):
介于 -1~1 之间
适用:比sigmoid更优
- ReLU修正线性函数
适用:无斜率趋于0的的时候,不会拖慢学习速度。激活函数的默认选择,大多数人再用
缺点:0处需要单独赋值,实际中影响不大;z在为负数时,导数为0。
- Leaky ReLU带泄露的修正线性函数
修正负数的斜率为0的情况,不常用
如何选择激活函数:在开发集中都测试看看,选最优。
神经网络的本质:用一堆非线性函数拟合非线性函数
-
为什么要用非线性激活函数?
如果用线性激活函数,不管有多少隐含层,最终都可以直接抽象成一层,隐含层就没有意义了。
PS:有可能用线性激活函数的情况——做回归的输出层(预测房地产价格等)
3.3 激活函数的导数
-
sigmoid函数:
![image-20220412221530230]()
z很大,很小的时候,斜率都接近于0,并且在0处,斜率为1/4
d g(z) = a(1-a) a=g(z)
-
tanh函数:

3. ReLU函数:
-
Leaky ReLU函数:
3.4 实现梯度下降算法

正向和反向传播
初始值的选择:
权重矩阵初始值不能全部设置成0,否则所有的隐含层都是对称的,都是在执行一样的功能,就没有意义了:

解决方法:用随机数初始化,如高斯随机函数,并且用很小的数值初始化,可以使其在激活函数中避免饱和,加快学习速度(若没有sigmoid或者tanh函数则影响不大):

3.5 矩阵/向量求导法则:
- 列向量对列向量求导:
求导布局:y为m维,x为n维,分子布局和分母布局分别如下:


以上这个就是雅可比矩阵
机器学习中,一般用以下法则:

- 标量对向量求导:

- 矩阵微分:

四、深度神经网络
4.1 基本模型
基本符号:

正向传播:

神经网络为什么需要多层?

反向传播:


自己推导:

反向传播中,权重矩阵需要取转置矩阵的原因:
https://blog.csdn.net/tugouxp/article/details/120171884

4.2 超参数
超参数就是学习率(调参侠):

不断地试,然后找出效果最好的一组学习率(要收敛)

浙公网安备 33010602011771号