课程:吴恩达深度学习
神经网络基础(p1-p47)
-
二元分类
-
一些规定:
- 训练集矩阵X:有nx行,m列,nx为输入数据维度,m为输入数据个数1
-
逻辑回归:用于二元分类的算法
- 逻辑回归参数:w,b
- 一种对预测值的猜想 y ^ = w T x + b \hat{y} = w^{T}x+b y^=wTx+b,这是一个对输入x的线性函数,但对二元分类并不是很好,y是0或1,我们想让 y ^ \hat{y} y^也在0~1之间。所以将上述的 y ^ \hat{y} y^式子作为自变量放入sigmoid函数中: σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1
- Logistic 回归损失函数
L
(
y
^
,
y
)
L(\hat{y},y)
L(y^,y):一般用预测值和实际值的平方差或者它们平方差的一半,但是通常在学习逻辑回归参数的时候,会发现优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值.
在逻辑回归模型中定义另外一个损失函数: 2
L ( y ^ , y ) = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) L(\hat{y},y) = -ylog(\hat{y})-(1-y)log(1-\hat{y}) L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
-
上述损失函数理解:
- y = 1 , L = − l o g ( y ^ ) y=1,L=-log(\hat{y}) y=1,L=−log(y^), L L L欲小则 y ^ \hat{y} y^欲大,一直趋近于1。
- y = 0 , L = − l o g ( 1 − y ^ ) y=0,L=-log(1-\hat{y}) y=0,L=−log(1−y^), L L L欲小则 y ^ \hat{y} y^欲小,一直趋近于0。
-
衡量算法在全部训练样本上的表现如何,定义算法的代价函数:对m个样本的损失函数求和然后除以m
J ( ω , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = 1 m ∑ i = 1 m ( − y ( i ) l o g ( y ^ ( i ) ) − ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ) J(\omega,b) = \frac{1}{m} \sum_{i=1}^{m} L(\hat{y}^{(i)},y^{(i)}) = \frac{1}{m} \sum_{i=1}^{m}( -y^{(i)} log(\hat{y}^{(i)})-(1-y^{(i)}) log(1-\hat{y}^{(i)}) ) J(ω,b)=m1i=1∑mL(y^(i),y(i))=m1i=1∑m(−y(i)log(y^(i))−(1−y(i))log(1−y^(i)))
-
- 梯度下降:
- ω : = ω − α ∂ J ( ω ) ∂ ω \omega := \omega - \alpha \frac{\partial J(\omega)}{\partial \omega} ω:=ω−α∂ω∂J(ω)
- α \alpha α 表示学习率用以控制步长
- 向量化与numpy:
- z = np.dot(w.T,x)+b
- 维度不同的向量不能直接相乘, 维度相同则计算结果为对应数字相乘,但同时要注意numpy的广播机制:(m,n)对(1,n)或(m,1)进行四则运算,(1,n)或(m,1)会自动补全。
- 尽量避免使用明确的for循环
- A.sum(axis = 0, keepdims = True)中的axis用来指明将要进行的运算是沿着哪个轴执行,在numpy中,0轴是垂直的(某列所有数相加),而1轴是水平的(行相加), keepdims表示保持矩阵的二维特性。
- numpy构造向量良好的规定:
a = np.random.randn(5) # a的shape是一个 ( 5 , )的结构:一维数组。既不是一个行向量也不是一个列向量,如果输出一个转置阵,最终结果它会和a看起来一样 a = np.random.randn(5,1) #这是5行1列向量 # 不完全确定一个向量的维度(dimension)时使用断言语句(assertion statement) assert(a.shape == (5,1))
- 进一步理解Logistic损失函数:
- 算法的输出
y
^
\hat{y}
y^是给定训练样本x条件下y等于1的概率:
if y = 1 : p ( y ∣ x ) = y ^ y=1: p(y|x) = \hat{y} y=1:p(y∣x)=y^
if y = 0 : p ( y ∣ x ) = 1 − y ^ y=0: p(y|x) = 1 - \hat{y} y=0:p(y∣x)=1−y^
p ( y ∣ x ) = y ^ y ( 1 − y ^ ) 1 − y p(y|x) = \hat{y}^{y}(1-\hat{y})^{1-y} p(y∣x)=y^y(1−y^)1−y - 最大化 l o g ( p ( y ∣ x ) ) log(p(y|x)) log(p(y∣x))等价于最大化 p ( y ∣ x ) p(y|x) p(y∣x),对数化简有: y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ylog\hat{y}+(1-y)log(1-\hat{y}) ylogy^+(1−y)log(1−y^)
- 这就是我们前面提到的损失函数的负数,前面有一个负号的原因是当你训练学习算法时需要算法输出值的概率是最大的(以最大的概率预测这个值),然而在逻辑回归中我们需要最小化损失函数。
- 对m个训练样本的训练集:
- 所有样本联合概率: P = ∏ i = 1 m P ( y ( i ) ∣ x ( i ) ) P = \prod_{i = 1}^{m} P(y^{(i)}|x^{(i)}) P=∏i=1mP(y(i)∣x(i))
- 进行最大似然估计:上述等式两边取对数得到 P = − ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) P = -\sum_{i=1}^{m}L(\hat{y}^{(i)}, y^{(i)}) P=−∑i=1mL(y^(i),y(i))
- 训练模型时,目标让成本函数最小化,所以去掉最大似然概率的负号,最后为方便对成本函数进行适当的缩放:加一个额外的常数因子 1 m \frac{1}{m} m1
- 算法的输出
y
^
\hat{y}
y^是给定训练样本x条件下y等于1的概率:
- 激活函数:
-
t
a
n
h
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}
tanh(z)=ez+e−zez−e−z
- 在隐藏层上使用tanh效果优于sigmoid,其均值更接近0,使下一层学习简单些
- 二分类问题输出层使用sigmoid
- sigmoid和tanh共同缺点:在z特别大或者特别小的情况,导数的梯度会变得特别小接近于0,降低梯度下降的速度。
- R e L U : a = m a x ( 0 , z ) ReLU:a = max(0, z) ReLU:a=max(0,z)
- L e a k y R e L U : a = m a x ( 0.01 z , z ) Leaky ReLU: a = max(0.01z, z) LeakyReLU:a=max(0.01z,z)
-
t
a
n
h
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}
tanh(z)=ez+e−zez−e−z
- 随机初始化:
注意random.randn操作后乘以个小的数(比如0.01)