Andrew Ng 深度学习笔记-01-week3-课程
一、专业词汇
a hidden layer of the neural network 神经网络的隐藏层
a single hidden layer 单隐藏神经网络
activation function **函数
the linear activation function 线性**函数
the identity activation function 恒等**函数
rectified linear unit 修正线性单元ReLU
the leaky ReLU 带泄露的ReLU
number of hidden units 隐藏单元数
initialize the weights 初始化权重
w prime w'
a sub gradient of the activation function g(Z) **函数g(z)的次梯度
gradient descent working 梯度下降算法
initialize the weights 初始化权重
completely symmetric 完全对称
partial derivative terms 偏导项
二、编程技巧
()表示是第几个样本
[ ] 表示是处于第几层(layer)
第一层的a[1]用于第二层的输入:
np.sum(dZ^[2],axis=1,keepdims=true):keepdims=true 开启,保证不会输出那些秩为1的数组
logistic 回归,可以将权重初始化为0;但将神经网络的各参数数组全部初始化为0,再使用梯度下降算法,将完全无效:
下面情况会导致两个(多个)隐藏单元计算一样的函数,不管进行多少次梯度下降,导致多个隐藏单元在此并没有真正的意义:
而我们需要的是通过不同的隐藏单元,去计算不同的函数,所以需要随机初始化所有参数:
通常将权重矩阵初始化成非常小的随机值(非常小的原因是将Z的值避开非常平缓的地方,不让其值过大或者过小,使的梯度下降更快,学习的更快):
当训练的神经网络很深时,可能要选择0.01以外的数
W^[1]=np.random.randn((2,2))*0.01
三、思维
在神经网络中,需要多次计算,反复计算z和a的值,最后计算loss函数
一个神经网络包括:输入层(input layer)表示第0层、隐藏层(hidden layer)有多个节点、 输出层(output layer)只有一个节点,输出预测值y^,一般不把输入层看作一个标准的层,隐藏层和输出层是带有参数的,隐藏层中包含w^[1] b^[1],输出层包含w^[2] b^[2],
在有监督学习中,可以看到输入和输出,在训练集中,看不到中间节点的真正数值
用a^[0]表示输入、a代表activations(**),意味着网络中不同层的值会传递给后面的层,即 输入层将x的值传递给隐藏层,隐藏层同样也会产生activations,将其记做a^[1],这里的a^[1]代表的是多维向量,在下面的例子中:
w^[1]是4*3的矩阵,4表示隐藏层中有4个节点,3表示有3个输入
b^[1]是4*1的矩阵
w^[2]是1*4的矩阵,1表示这一层有一个输出,4表示隐藏层中有4个节点
详细解释:
将四个等式向量化:
进一步得到:(在已知的单个训练样本中,计算神经网络的预测值)
将不同训练样本向量化:
将双下标的进行横向堆叠:
针对A[1]:
竖向扫描对应的不同的隐藏单元(不同的输入特征):
第一行第一个元素代表 第一个训练样本对应的第一个隐藏单元的**函数
第二行第一个元素代表 第一个训练样本对应的第二个隐藏单元的**函数
第三行第一个元素代表 第一个训练样本对应的第三个隐藏单元的**函数
.............
横向扫描对应不同的训练样本:
第一行第二个元素代表 第二个训练样本对应的第一个隐藏单元的**函数
第一行第m个元素代表 第m个训练样本对应的第一个隐藏单元的**函数
.............
左边即为在单个训练样本中实现正向传播算法:
对几个样本进行正向传播计算:
为简化,将b的值设置为0
对于不同种类的**函数的选择,大部分可以尝试使用ReLU,但是具体的什么函数更加适合,可以在我们的保留交叉验证数据集和开发集上跑一跑,看看哪个参数效果更好,就用哪个:
非线性的**函数有:
sigmoid:
tanh():
tanh()的范围是-1到1,所以通过它得到的最终的结果的平均值更接近0,达到更佳的数据中心化的效果
在后续的例子中,除非结果是非0即1的二元分类的输出层的时候,输出层会选择sigmoid作为**函数,其他情况一般不会选择sigmoid
每一层(layer)的**函数可以不同,用[]上标加以区分
当z的值特别大或者特别小的时候,图像的斜率会接近于0,这样会拖慢梯度下降算法,更常用的是ReLU(默认的时候使用,或者不确定隐藏层用什么的时候使用),使用ReLU的好处在于:对于很多z空间,**函数的导数、斜率和0相差很远,在实践中使用ReLU能使我们的神经网络的学习速度更快
ReLU:
the leaky ReLU:
为何一定要用非线性函数:假如用线性函数,则最后的a^[2]只是把输入的线性组合再次输出,假如第一个隐藏层都用线性**函数,输出层用sigmoid,整个模型的复杂度和没有任何隐藏层的标准逻辑logistic回归是一样的。即线性隐层没有任何意义。
只有输出结果是一个实数的时候(比如房价),最后的输出层可以使用线性**函数,隐藏层里面必须使用非线性**函数
**函数的导数:
sigmoid:
tanh() :
ReLU::
leaky ReLU:
等于0跟着谁是无关紧要的:
神经网络梯度下降:
神经网络的正向传播与反向传播: