深度学习笔记(2) 神经网络基础
1. 二分类
逻辑回归是一个用于二分类(binary classification)的算法
这里有一个二分类问题的例子:假如有一张图片作为输入,比如这只猫
如果识别这张图片为猫,则输出标签1作为结果
如果识别出不是猫,那么输出标签0作为结果
用字母y来表示输出的结果标签
计算机中为了保存一张图片,需要保存三个矩阵,它们分别对应图片中的红、绿、蓝三种颜色通道
如果图片大小为64x64像素,那么就有三个规模为64x64的矩阵,分别对应图片中红、绿、蓝三种像素的强度值
为了把这些像素值转换为特征向量 x,需要像下面这样定义特征向量 x 来表示这张图片,把所有像素都取出来
那么向量 x 的总维度= 64 x 64 x 3 = 12288,用nx = 12,288,来表示输入特征向量的维度(一般直接用n)
在二分类问题中,目标就是学习得一个分类器,以图片的特征向量作为输入
然后预测输出结果y为1还是0,也就是预测图片中是否有猫:
符号定义 :
- x :表示一个nx维数据,为输入数据,维度为(nx,1)
- y :表示输出结果,取值为(0,1)
- (x(i),y(i)) :表示第 i 组数据,样本的输入和输出
- X = [x(1),x(2),…,x(m)] :表示所有的训练数据集的输入值,放在一个 nx×m的矩阵中,其中m表示样本数目
- Y = [y(1),y(2),…,y(m)] :对应表示所有训练数据集的输出值,维度为1×m
在Python实现神经网络时,为了让整个实现的过程变得更加简单,需保证X.shape=(nx,m),即X =X.T
同样地使用Python保证 Y.shape=(1,m)
2. 逻辑回归
对于二元分类问题来讲,给定一个输入特征向量X,它可能对应一张图片
想识别这张图片识别看它是否是一只猫或者不是一只猫的图片,需要一个算法能够输出预测 (对实际值 y 的估计)
更正式地来说,让 y 等于1的一种可能性或者是机会,前提条件是给定了输入特征X
换句话来说,如果X是看到的图片,想让
y ^ \hat{y}
y^ 来告诉这是一只猫的图片的概率P有多大
用 w 来表示逻辑回归的参数,这也是一个nx维向量
因为w实际上是特征权重,维度与特征向量相同
参数里面还有 b ,这是一个实数,类似截距,表示偏差
所以,给出输入x以及参数w和b之后,产生输出预测值
y^ \hat{y}
y^
一件可以尝试却不可行的事是让
y ^ \hat{y}
y^ =wT x+b
这时候得到的是一个关于输入x的线性函数,实际上这是在做线性回归时所用到的
但是这对于二元分类问题来讲不是一个非常好的算法
因为
y ^ \hat{y}
y^ 应该在0到1之间来表示实际值y等于1的概率
因此在逻辑回归中,输出应该是
y ^ \hat{y}
y^ 等于由上面得到的线性函数式子作为自变量的 sigmoid 函数
公式如下图sigmoid函数的图像最上面所示,将线性函数转换为非线性函数
把水平轴作为z轴,那么关于z的 sigmoid 函数是平滑地从0走向1
通常都使用z来表示 wT x+b的值
如果 z 非常大,那么 e(-z) 将会接近于0,关于 z 的 sigmoid 函数将会近似等于1
相反地,如果 z 非常小或者说是一个绝对值很大的负数,那么 e(-z) 会变成一个很大的数, sigmoid 函数就接近于0
在实现逻辑回归时,就是去让机器学习参数w以及b这样才使得
y ^ \hat{y}
y^ 成为对 y = 1 这一情况的概率的一个很好的估计
3. 逻辑回归的代价函数
损失函数又叫做误差函数,用来衡量算法的运行情况,Loss function:
L L
L(
y^ \hat{y}
y^,y).
通过这个
L L
L称为的损失函数,来衡量预测输出值和实际值有多接近
一般用预测值和实际值的平方差或者它们平方差的一半
但是,通常在逻辑回归中不这么做,因为它的优化目标不是凸优化,只能找到多个局部最优值
对于逻辑回归的概率 :p(y|x) =
y ^ \hat{y}
y^(y) (1 - KaTeX parse error: Got function '\hat' with no arguments as superscript at position 8: y ^ \̲h̲a̲t̲{y}
y^)(1-y)
而 log 函数是严格单调递增的函数
最大化
log\log
log(p(y|x)) 等价于最大化 p(y|x)
并且计算 p(y|x) 的
log \log
log 对数,就是计算
log \log
log(
y ^ \hat{y}
y^(y) (1 -
y ^ \hat{y}
y^)(1-y))
对数函数化简为:y
log \log
log
y ^ \hat{y}
y^+(1 - y)
log \log
log(1 -
y ^ \hat{y}
y^ )
再加上负号,原因是 log 函数当在输入接近0时,输出接近负无穷;在输入接近1时,输出接近0
而训练学习算法时需要算法输出值的概率是最大的,代价最小
所以,在逻辑回归中用到的损失函数是:
当 y = 1 时损失函数
L L
L = -
log \log
log(
y ^ \hat{y}
y^),想要
L L
L尽可能得小,那么
y ^ \hat{y}
y^就要尽可能大,所以
y ^ \hat{y}
y^ 会无限接近于1
当 y = 0 时损失函数
L L
L = -
log \log
log(1 -
y ^ \hat{y}
y^ ),想要
L L
L尽可能得小,那么
y ^ \hat{y}
y^ 就要尽可能小,所以
y ^ \hat{y}
y^ 会无限接近于0
损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何
为了衡量算法在全部训练样本上的表现,需要定义一个算法的代价函数是对m个样本的损失函数求和然后除以m:
在训练逻辑回归模型时候,需要找到合适的w和b,来让代价函数
J J
J 的总代价降到最低
4. 梯度下降法
梯度下降法的形象化说明:
找到使得代价函数(成本函数)
J J
J(w,b)函数值是最小值,对应的参数w和b
迭代就是不断重复做如图的公式:
α \alpha
α 表示学习率(learning rate),用来控制步长(step),即向下走一步的长度
d J ( w ) / d w dJ(w)/dw
dJ(w)/dw 就是函数
J J
J(w)对w 求导(derivative)
以如图点为初始化点,该点处的斜率的符号是负的,即
d J ( w ) / d w dJ(w)/dw
dJ(w)/dw < 0,所以接下来会向右走一步
整个梯度下降法的迭代过程就是不断地向右走,即朝着最小值点方向走
逻辑回归的代价函数(成本函数)
J ( w , b ) J(w,b)
J(w,b)是含有两个参数的
∂ 表示求偏导符号(partial derivative),读作round
小写字母 d 用在求导数(derivative),即函数只有一个参数
∂
J
(
w
,
b
)
/
∂
w
∂
J
(
w
,
b
)
/
∂
w
∂ J ( w , b ) / ∂ w ∂J(w,b)/∂w
∂J(w,b)/∂w∂J(w,b)/∂w
∂J(w,b)/∂w 就是函数
J ( w , b ) J(w,b)
J(w,b) 对 w 求偏导
∂
J
(
w
,
b
)
/
∂
b
∂
J
(
w
,
b
)
/
∂
b
∂ J ( w , b ) / ∂ b ∂J(w,b)/∂b
∂J(w,b)/∂b∂J(w,b)/∂b
∂J(w,b)/∂b 就是函数
J ( w ,b ) J(w,b)
J(w,b) 对 b 求偏导
5. 逻辑回归中的梯度下降
逻辑回归的公式定义如下:
损失函数:代价函数:
w , b 的修正量:
假设现在只考虑单个样本的情况,单个样本的代价函数定义如下:
而逻辑函数的导数
d
a
/
d
z
d
a
/
d
z
d a /d z da/dz
da/dzda/dz
da/dz:
根据上面的推导结果,对权重求导:
权重更新:
6. 简化的代价函数
如果不分w和b,值用θ表示权重
代价函数,利用上面的结果,借助复合函数求导公式等,可得:
向量化形式:
此时权重更新:
参考:
相关推荐:
谢谢!