神经网络-逻辑回归
目录
逻辑回归
概念
定义:
LossFun:
costFun:
tips
- 这里不用普通
L1
Loss 的原因:使用 L1loss 会使得GD
无法找到全局最优解(因为不是凸函数) - costFun 与 LossFun 都可以用作损失函数(类似
梯度下降
与随机梯度下降
的关系)
梯度下降
- w这里以列向量形式存在。在编程中也推荐这样看待
- 每一步都是向最陡的地方迈
α 步,这里的α 称为learning Rate
。 - 选取
learning Rate
时要选择能接受速度的最小值。原因:需要符合泰勒展开定理
中的变量需无限趋近于无穷小时才成立。 - 具体详情请参考
梯度下降
笔记内容.
绘制计算分析图
学会绘制计算分析图对组建神经网络帮助很多,可以直接从绘制好的图像转为从输入到输出的神经元走向序列。
上图是一个例子的计算分析图:
方法
- 先将算式进行分块,每一个相同优先级的运算作为一块。
例如上例中我们分出了3块子算式:
u=bc
v=a+u
J=3v -
根据人脑计算式子的优先级方式,将输入变量按顺序与每一块子算式相连。
如上例中连接顺序:-
b``c
->u=bc -
u``a
->v=a+u -
v
->J=3v - 有时我们也将组建计算分析图的过程,称为组建神经网络的
正向传播
过程 - 相应的由结果一步步向回求导的过程,称为组建神经网络的
反向传播
过程
- 有时我们也将组建计算分析图的过程,称为组建神经网络的
-
逻辑回归中的梯度下降
这里梯度下降使用
简单的算法描述
J = 0;dw=0;dw2=0;db=0
For i=1 to m:
z(i) = w^tx^i+b
a(i) = sigma(z(i))
J+= - [y^i*lg(a^i)+(1-y^i)lg(1-a^i)]
dz(i) = a(i) - y(i)
dw1 += x1(i)*dz(i)
dw2 += x2(i)+dz(i)
db += dz(i)
J/=m
dw1/=m
dw2/=m
db/=m
w1=w1 - alpha*dw1
w2=w2- alpha*dw2
b=b - alpha*db
上述伪码的问题:实际上有两个 for,一个是输入数据个数,一个是一个数据的特征个数。但显然我们将两个 for 显式的定义在程序内会影响程序运行效率
解决方案:变量矢量化
矢量化
- 使用 numpy 会最大并行化代码中的矢量化相乘数据。从而相比单线程的 loop 效率有很大提升
- 在实际计算中尽量避免在程序中使用 loop 方式声明计算
- 当在编程中不确定你的矩阵的维数时候,请手动使用 np.reshape 来声明维数(方便之后读取)
对于上面例子,矢量化去掉所有 for
J = 0;dw = np.zeros(m,1);db=0 # 定义参数 w 时直接将其作为一个向量看待
Z = np.dot(w.T,X)+b
A = sigma(z)
J += - [Y*lg(a)+(1-Y)lg(1-a)]
J /= m
dZ = A - Y
dB = np.sum(dZ)/m
dW += 1/m*X*dZ.T
W=W - alpha*dw
B=B - alpha*db
tips:numpy广播机制引起的隐形 bug 以及解决
- 定义行/列向量时请使用(m,1)(1,m)来取代(m)
- 如果直接定义 a = numpy.random.randn(5)得到的既不是行向量也不是列向量
- 这样在期待列向量 x 行向量变为一个矩阵时。将得到一个数
- 如果不幸定义了(m,)结构的向量请使用 reshape 重新定义
- 在定义矩阵后,请时常使用 assert断言语句做检查 例如 assert(M.shape== (2,3)),当断言出错时程序会主动提醒
- 标准化是必须的,默认使用列的2范数标准化,方法
∥x∥=np.linalg.norm(x,axis=1,keepdims=True)
其中||x||=∑x2i‾‾‾‾‾‾√ - 当高维度矩阵降维时,使用
reshape(xxx,-1)
.其中-1指的是将后面维度拍在一起
回顾:深度学习训练步走
1.初始化
:初始化输入(数值归一化,图像做处理等等)创建参数阵 包装中途函数等
2.传播
:模型的构建,之后不一定采用传播。不过使用传播时使用正向传播
(in->out)再反向传播
回来(out->in 梯度)[反向时定义 Loss与 Cost]
3.优化
:梯度下降时更新:
4.
不断迭代