吴恩达deep-learning 深度学习笔记(前三周)
学习目录1.神经网络与深度学习2. 深层神经网络的改进:超参数化、正则化与优化3. 构建机器学习系统4.卷积神经网络(CNN)5.自然语言处理:建立序列模型1.神经网络与深度学习很简单的神经网络:根据数据拟合出一个函数,或者是回归方程单个神经元(神经网络)![整体神经网络](https://img-blog.csdnimg.cn/39727f523c724467a1b51f6ad3378788.p
学习目录
1.神经网络与深度学习
很简单的神经网络:根据数据拟合出一个函数,或者是回归方程
其中中间的部分叫做隐藏神经元
神经网络看起来很有意义,实际上得到效益的只是其中的监督学习的一种方式
房地产;在线广告(标准神经网络CNN)
,照片标记,(卷积神经网络CNN)
CNN常用于图像的处理
语音识别,(循环神经网络RNN)
机器翻译;(RNNS)
RNN可能适用于序列化数据,语言,音频这样
自动驾驶
结构化数据:数据库的数据或者表
非结构化数据:图像、音频
逻辑回归是一个二元分类的算法:期待y是0或1
图像在计算机中的存储是,红蓝绿三个矩阵,如果图片是6464,那么三个矩阵就是6464的。
M = M(train)
M(test)表示测试的总量
为什么是n(x)行?
x是一个n(x)维的特征向量
_16)
Y是一个1*m大小的矩阵
逻辑回归模型:
函数L被称为损失函数,需要进行设定,才能在时标为y时对输出的y^进行检测。
也就是当y=1时,(1-y)=0;要求logy足够大,也就是y^足够大,但是最大是1,也就是无线接近1。
代价函数,使用w和b,来优化你的函数
定义平均值,计算1----m的损失之和:衡量你的算法效果
所以给出梯度下降算法(gradient descent)的说明:
不断地迭代
@的意思是学习率,就是每次移步的多少
看图中的w:公式,因为在w点的导数是正的,所以每次w=w - 正数,所以每次都是向左移动的(另一边同样的道理,最后都会趋向于一点)
这是对于单个函数的训练。
Python中np.dot(),矩阵的乘法。
向量化的代码要比循环的代码快许多倍,这个数字可能是300.
在实际的代码中,要尽量避免使用for循环,多使用其他办法
尽量把for循环转换成向量的乘法,然后使用numpy来计算,也就是不需要一次次的计算Z和a,可以通过一行代码来实现(sigma函数)
广播
广播是一种能使得python运行的更快的技术
import numpy as np
A = np.array([[56.0, 0.0, 4.4, 68.0],
[1.2, 104.0, 52.0, 8.0],
[1.8, 135.0, 99.0, 0.9]])
print(A)
cal = A.sum(axis=0) # axis意思是垂直方向求和,
print(cal)
percentage = 100 * A / cal.reshape(1, 4) # reshape改为一个1*4的数组
print(percentage)
python的广播 示例,自动将常数改为矩阵
a = np.random.rand(5) # 会产生五个随机的高斯数并存储在a数组中
print(a)
print(a.shape)
# 这里a和a的转置产生的结果是一样的
print(a.T)
# 这里期待的是产生一个内积数组,但是实际上产生的却是一个数
print(np.dot(a, a.T))
# 这样写容易出bug 以为 (5,1)和(1,5)的表现形式是一样的,所以建议在生成的时候直接写成如下
b = np.random.rand(5, 1)
print(b)
print(b.shape)
print(b.T)
# 这样的话,b和b的转置就不一样了
print(np.dot(b, b.T))
神经网络
大概长这样
看看具体代表什么?
这张图下面代表的是只有一个隐藏层(也就是你的训练中看不到的数据),网络的层数不算输入层,所以这是一个二层网络。
隐藏层有两个参数,一个w一个b,w是一个(4,3)的矩阵,b是个(4,1)的矩阵。使用w[1],b[1]来表示这些参数
w的4意思是有四个节点,或者四个隐藏单元,数字3来自于这里有三个输入特征。
同样的输出层也有两个参数,一个w一个b,w是一个(1,4)的矩阵,b是个(1,1)的矩阵。使用w[2],b[2]来表示这些参数
隐藏层有四个单元,输出层只有一个单元
下一步,了解这个神经网络在计算什么,怎么输入x,以及又是怎么得到y的
上标表示第几层,下标表示第几个节点
不能用for循环,需要向量化
比如a^[2](i) 表示第二层的第i个训练样本。
一个for循环,遍历所有的m训练样本。
激活函数的选择
有时候并不一定要使用sigmoid函数,其他选择也许更好。
eg:a = tanh(z) 很多时候要比sigmoid函数表现的更好。
选择激活函数要看你的y的期待值是多少,如果其他平均是0,那么明显tanh(z)更好,如果期待的是【0,1】,那么可能还是sigma比较好。
sigmoid函数如果使用的话,那就是二元分类的输出层,否则别用,因为tanh所有场合都比优越。
注意:来自sigmoid函数的输出值可以很容易地理解为概率
但是如果当z特别大的时候,这些激活函数表现的并不是特比的好,
因为它们的斜率趋近于0,所以在机器学习中,有修正线性单元(ReLU)函数:a=max(0,z)
这种函数已经默认变成了激活函数的选择
有其修改版本就是带泄露的ReLU,这种函数在z为负数时,倒数不是0,而是一个缓缓地坡度。(但是使用不多)
为什么会需要某种非线性的激活函数?
这个模型的输出y或帽不过是你输入特征的线唯组合,事实诩E明如果你使用线性激活函数,那么无论你的神经网络有多少层,一直在做的只是计算线性激活函数。
像这样:
二次迭代以后,还是wx+b,没有意义
g(z) = z就是如果你要机器学习的是回归问题 ,所以y是一个实数,比如说你想预测房地产价格,那么用线性激活函数也许可行。但是一般唯一可用的,还是输出层。
梯度下降,基础,估算、计算
单个激活函数的导数,斜率
在训练神经网络时随机初始化参数很重要,而不是初始化成全零
迭代的函数过程。
可以使用keepdim = true 或者reshape来调整,使得输出的是期待的矩阵。
选看,正向推导的四个式子以及反向推导的6个式子
虽然暂时看的不是完全懂
随机初始化权重
对于logistic回归可以将权重初始化为零,但如果将神经网络的各参数数组全部初始化为0,再使用梯度下降算法那会完全无效
那么因为两个隐藏单荒一开始就在做同样的计算,两个隐藏单元对输出单元的影响世一样大,那么在十次迭代之广同样的对称性依然存在。无论你训练神经网络多长时间,两个隐藏单元仍然荏计算完全一样的函数。所以在这种情况下多个隐藏单元真的没有意义。
这个询题的解决方案是随机初始化所有参数(感觉这里可以考虑,线代的相似,或者是矩阵的秩这个方向的东西),我们通常把权重矩阵初始化成非常小的随机数,因为如果你用的是tanh或者sigmoid激活函数,或者你在输出层有一个sigmoid函数,如果权重太太当你计算激活函数值时,z值会很大或者很小,最后你的点落在这些tanh丞数或者sigmoid丞数的平缓部分。
梯度的斜率非常小,意味着梯度下降法会非常慢,所以学习会非常慢。
当然这个常数的设定是可以变的,感觉会影响效率
错题
第三周的9、10也不是特别理解
2. 深层神经网络的改进:超参数化、正则化与优化
3. 构建机器学习系统
4.卷积神经网络(CNN)
5.自然语言处理:建立序列模型
包括循环神经网络(RNN)以及LSTM模型
更多推荐
所有评论(0)