通过神经网络来解决二分类问题
首先是任何和基本符号的说明
我们要解决一个二分类问题,比如要识别一副图片是否是一只猫咪,所以输入是图片数据,输出是 1 or 0 代表是猫咪,不是猫咪
(x,y)代表训练数据的一条数据对,x是输入数据,y是label即标记
X是
n
x
n_x
nx维的,比如图片是 64 X 64 像素的图片,我们把它拉长成一个长的向量,向量的大小是 64 X 64 X 3 ,乘以3是因为图片是RGB 3通道的。
训练集的大小是m ,另外一个trick是我们通常要把所有输入数据写成矩阵的形式,大写X,维度是
(
n
x
,
m
)
(n_x,m)
(nx,m),每一列是一条样本,共m列。
下面用逻辑回归来解决这个二分类问题,
Given x ,want
y
h
a
t
=
P
(
y
=
1
∣
x
)
y^{hat} = P( y = 1|x)
yhat=P(y=1∣x)
即用概率的形式来表示,当已知输入x,y = 1的概率,即是一只猫咪的概率。
我们知道线性回归函数的表达形式
y
=
w
x
+
b
y=wx+b
y=wx+b
这里我们习惯把b 与 w和到一起,写成
θ
\theta
θ即
y
=
θ
y=\theta
y=θx
已经选择了逻辑回归作为模型,下面我们确定损失函数
在这里,我们不使用平方损失函数作为loss Function 因为在这里它是非凸的,无法得到全局最优解,我们使用以下函数
其中Loss Function ,这是对单个训练样本的损失
L
(
y
h
,
y
)
=
−
(
y
l
o
g
y
h
+
(
1
−
y
)
l
o
g
(
1
−
y
h
)
)
L(y^h,y)=-(ylog y^h + (1-y)log(1-y^h))
L(yh,y)=−(ylogyh+(1−y)log(1−yh))
其中Cost Function 是对整个训练集的平均损失,它是关于参数w,b的函数,我们通过对它最小化,得到最优的w,b
J
(
w
,
b
)
=
1
m
∑
(
L
(
y
h
,
y
)
)
J(w,b)=\frac{1}{m}\sum(L(y^h,y))
J(w,b)=m1∑(L(yh,y))
定义好代价函数后,通过链式求导法则,计算每个参数关于损失函数的偏导,就可以使用梯度下降,不断迭代更新参数
这里吴恩达提到了vectorization 非常重要,也就是向量化计算,通过它来代替 for-loops 可以大大提升程序的运算速度。
上面的代码,对比了通过np使向量点乘 和 使用for-loops来做同样的操作,可以看到,运算时间相差百倍的,这个差距是非常巨大的。
除了点乘外,还以np.exp() np.log() np.max 以及矩阵和向量乘法等操作都是vectorization
下面我们用python 代码来手写逻辑回归
先上andrew伪代码