神经网络-逻辑回归

时间:2022-11-04 23:52:45

神经网络-逻辑回归

目录

逻辑回归

概念

定义:

ŷ =σ(wTx+b)

σ(z)=11+ez

LossFun:
L(ŷ ,y)=(ylogŷ +(1y)log(1ŷ ))

costFun:
1mi=0mL(ŷ i,yi)

tips

  • 这里不用普通 L1Loss 的原因:使用 L1loss 会使得 GD无法找到全局最优解(因为不是凸函数)
  • costFun 与 LossFun 都可以用作损失函数(类似梯度下降随机梯度下降的关系)

梯度下降

w1=w0αdJ(u)dw

  • w这里以列向量形式存在。在编程中也推荐这样看待
  • 每一步都是向最陡的地方迈 α 步,这里的 α 称为learning Rate
  • 选取learning Rate时要选择能接受速度的最小值。原因:需要符合泰勒展开定理中的变量需无限趋近于无穷小时才成立。
  • 具体详情请参考梯度下降笔记内容.

绘制计算分析图

学会绘制计算分析图对组建神经网络帮助很多,可以直接从绘制好的图像转为从输入到输出的神经元走向序列。
神经网络-逻辑回归
上图是一个例子的计算分析图:

J(a,b,c)=3(a+bc)

方法

  1. 先将算式进行分块,每一个相同优先级的运算作为一块。
    例如上例中我们分出了3块子算式:
    u=bc

    v=a+u

    J=3v
  2. 根据人脑计算式子的优先级方式,将输入变量按顺序与每一块子算式相连。
    如上例中连接顺序:

    1. b``c-> u=bc
    2. u``a-> v=a+u
    3. v -> J=3v

      • 有时我们也将组建计算分析图的过程,称为组建神经网络的正向传播过程
      • 相应的由结果一步步向回求导的过程,称为组建神经网络的反向传播过程

逻辑回归中的梯度下降

这里梯度下降使用

varnew=varαdvar
的方法来更新参数

简单的算法描述

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.优化:梯度下降时更新:

w2=w1αdw

4. 不断迭代