Andrew Ng深度学习课程笔记阅读记录(1):神经网络和深度学习

  1. 深度学习要想获得较好的性能体现,有两个条件:一是要训练一个足够大的神经网络以发挥数据量巨大的特点,二是需要很多的数据。小数据规模的训练集上,性能效果取决于特征工程的能力。

2.损失函数是在单个训练样本上定义的,衡量的是算法在单个训练样本中表现如何;为了衡量算法在全部训练样本上表现如何,需要定义的是代价函数,代价函数是对m个样本的损失函数求和再除以m

3.计算图:正向可以方便的计算代价函数J,反向可以方便的求导。

4.逻辑回归的推导:


前向

反向求导

m个样本的梯度下降:带有求和的全局代价函数,实际上是1到m项各个损失的平均。所以它表明全局代价函数对w1的微分,对w1的微分也同样是各项损失对w1微分的平均。



在这个过程中应该要写两个for循环,外层for循环遍历所有的样本,内层for循环遍历所有的特征。使用向量化技术可以摆脱这些for循环。

5.向量化编程与非向量化编程时间对比:

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic_vec = time.time()

c = np.dot(a,b)
toc_vec = time.time()
print(c)
print("向量化耗费时间:"+str(1000*(toc_vec-tic_vec))+"ms")

c = 0
tic = time.time()
for i in range(1000000):
    c += a[i]*b[i]
print(c)
toc=time.time()
print("非向量化耗费时间:"+str(1000*(toc-tic))+"ms")

6.上一个m个样本梯度下降的算法可以这样写:


7.numpy广播机制
如果两个数组的后缘维度的轴长度相等或其中一方的轴长度为1,则认为它们是广播兼容的。广播会在缺失维度和轴长度为1的维度上进行。
后缘维度,即A.shape[-1],矩阵维度元组中的最后一个位置的值。


8.我们计算神经网络的层数时,只算隐藏层和输出层,不算输入层。

9.关于隐藏层的权重维度W,我们设置为隐藏层的节点数/单元数输入特征数量,关于偏置向量b,维度是隐藏层的节点数要分类的数量。
检查维度:

image.png

向量化后:
b向量化后的维度不变,但是python的广播机制会把它第二维变为m。
image.png

10.激活函数及其导数 https://blog.csdn.net/u011684265/article/details/78039280
tanh函数在任何场合都优于sigmoid函数,但是tanh的值域位于-1和+1之间,所以二分类时,想让输出的y(预测值)在0,1之间,选取sigmoid函数。它们两个都会出现梯度消失和梯度爆炸现象。
Relu:(修正线性单元(Rectified linear unit)
经验选择:
二分类问题,输出层选sigmoid,其余选Relu
Tanh:优秀,几乎可以用于所有场合
Relu: 如果不确定用哪个激活函数,就用Relu或Leaky Relu

11.为什么要用非线性激活函数?
事实证明如果你在隐藏层用线性激活函数,在输出层用 sigmoid 函数,那么这个模型的复杂度和没有任何隐藏层的标准 Logistic 回归是一样的。只有一个时候可以用线性激活函数,那就是机器学习二等回归问题

12.神经网络中的随机初始化
对于逻辑回归来说把权重初始化为0是可以的,但是对于神经网络,如果把权重或者参数都初始化为0,那么梯度下降就不会起作用了,这会导致隐藏单元计算同样的函数,即导致隐藏单元对称。
因此初始化W的时候用np.random.rand(2,2)再乘以一个很小的数,生成一个比较小的高斯分布的随机数。b的话可以初始为0。如果W很大,且选取的激活函数为tanh/sigmoid函数,会造成停留在tanh/sigoid函数的平坦的地方,梯度很小,学习很慢。

13.Coding中的小知识
在神经网络中,不要使用shape为(n,)这种秩为1的数组,用np.reshape让它变成(n,1)的向量,当不确定你设置的这个向量的维度是,用一下断言,如:assert(a.shpe ==(5,1))

#正则化
import numpy as np
x = np.array([
    [0, 3, 4],
    [1, 6, 4]])
x_norm = np.linalg.norm(x, axis=1, keepdims=True)
# Divide x by its norm.
x = x / x_norm
print(x)

#L1范数
loss = np.sum(np.abs(y - yhat))

#L2范数
loss = np.dot((y - yhat),(y - yhat).T)

14.向量化深层网络中的前向传播


image.png

向量化就是把所有训练集的数据水平堆叠起来。右边的部分,在经过这些隐藏层进行前向传播时是要使用for循环的,这个地方的for循环是不可省略的。

15.我们可以把神经网络的前几层视为能学习一些低层次的简单特征,到后几层,就能把简单的特征结合起来去探测更复杂的东西。

16.参数与超参数
例如learning rate,iterations(梯度下降法循环的次数), L(隐藏层的数目),隐藏层单元的数目,激活函数的选择,都控制了最后的参数W和b,它们就是超参数。

你可能感兴趣的:(Andrew Ng深度学习课程笔记阅读记录(1):神经网络和深度学习)