深度学习(入门)——逻辑回归模型(Logistics Regression)

2023-11-16

从逻辑回归开始,是因为这是一个简单的,可以理解成为一个简单的一层的神经网络,后续将逐步深入,了解更复杂的神经网络

一,假设函数       

  逻辑回归算法适用于二分类问题,例如在输入一个猫的图片到模型中,模型会输出1(这是一只猫),或者0(不是一只猫)。

        对于二元分类问题,给定一个输入的特征向量X,他可能对应一个照片,在吴恩达教授的课程中,暂时是将该逻辑回归模型设置成: 

y(hat) = w x + b,

        做线性回归问题对二分类来讲        并不是一个好的算法。由于这样的得出来的结果可能是大于1,也可能是小于0,这对我们所需要的输出是没有任何意义的,我们所需要的输出是在0~1之间的结果,于是需要对线性函数转化为非线性函数:sigmod函数

 

 这个函数就可以将线性回归的模型都放在0~1之间。

 二,代价函数

        对于一个预测模型,我们要怎样才能判断这个模型是否准确,这是就需要代价函数来进行描述,

 我们需要判断,这里的y(hat)与真实的y之间的误差。于是定义了损失函数(Loss Funcation)      L( y(hat) , y)

 通常我们会采用最小二乘法来比较预测值和和真实值之间从差别(与凸优化有关,不是很懂),虽然平方差是一个不错的函数,但是在这里我们的损失函数是:

 这样做有一个好处,我们可以举两个例子:

        当y = 1时,L= - log( y (hat) ),如果想要损失函数较小,由于sigmod函数的取值是[0,1],所以y(hat)就会趋向1,从而其会趋近于1;

        当y = 0时,L= - log(1 - y(hat) ),如果想要损失函数较小,则y(hat),就会趋向是1;

损失函数是针对某一个单独的样本来说的,如果要衡量一整个算法样本的表现,就需要定义一个代价函数:

         这个代价函数是针对数据集中一共有m个样本来说的。所以在训练一个回归模型的时候骂我们需要知道最合适的 和 b 来让代价函数 J( w , b)达到最小。

三, 梯度下降法

        梯度下降法可以做什么呢?梯度下降法可以训练代价函数 J( w , b) 中的参数w 和 b。

        梯度:即函数下降最快的方向,由于代价函数的特性(个人认为这里是因为在运用梯度下降法 的时候只能是朝一个方向变化),所以必须定义代价函数是凸函数

初始化参数w 和 b:

 观察图中的红点的变化,由于代价函数是一个凸函数,所以在这里,无论初始化在哪一个点,最终都会在最低点附近。

        于是,给出迭代的公式:

 其中 为学习率(leraning rate),用来控制步长。

四,计算图

计算图 的目的是为了在每一步中,方便计算前向和反向传播。计算图就是方便组织这种计算导数。举个栗子。

 在计算这一块,大家需要了解导数的计算,偏导数的计算,还有链式法则,那么这一块就可以了解的很清楚。

五,逻辑回归中的梯度下降法。

在这里,我们首先假设在逻辑回归模型中,只设置两个特征值x1和x2,那么输入桉树就有吧w1,w2和 b,因此总结一下公式

 于是,在这里计算梯度函数,计算过程如下

如果大家想要对这个过程了解的更加透彻,那么可以将这个过程完整的过一遍。

六,向量化的操作

向量化是一种基本的取出for循环的艺术。在深度学习领域,经常需要去训练很大的数据集,所以运用向量化的技巧去去除for循环,提高运算速度.。

例如,如果是计算 z = w *x+b,则计算过程就像这样:

z=0
for i in range(n_x)
z+=w[i]*x[i]
z+=b

如果是向量化计算,则一句就可以解决,这个背后的数学基础其实就是线性代数里面的矩阵乘法

z = np.dot(w,x) + b

将二者进行对比的代码

import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
print("向量化的版本是"+ str(1000*(toc - tic))+"ms")
print(c)

c = 0
tic = time.time()
for i in range(1000000):
    c += a[i]*b[i]
toc = time.time()
print(c)
print("for loop的版本是"+ str(1000*(toc - tic))+"ms")

 对比出的效果十分明显。

七,逻辑回归中的向量化

        首先,我们先复习一下,在逻辑回归中的前向传播的步骤:

首先,我们可以 设置一个A矩阵,用于表示将这个输入的样本集:

 显然,我们现在需要求解z,那么转化成矩阵的形式,在这里就变成了 Z = W(T) * A + b;这里的b是运用的在Python中的Broadcoasting的功能,这个功能后续再讲解。经过计算之后,所得的Z值就变成了一个行向量,之后再经过sigmoid函数的运算,就可以将整个训练集的y(hat)计算出来。

那么这一步在代码里面,就是这样

Z = np.dot(w.T,x) + b#这里的b运用的是Broadcoasting的功能

 除了正向化操作,下面介绍向量化操作反向运算,反向运算的步骤:

        dz = a - y;
        dZ = [dz(1),dz(2),dz(3)......dz(n)];
        于是: dZ = A - Y(矩阵运算)

翻译成代码的形式

db = 1/m * np.sum(dZ)
dw = 1/m * X * dz.T

八,广播(Broadcoasting)

        通俗理解,其实就是在Python中,自动的将单独的数值扩展成一个数组或者矩阵。附上下面一张图:

 

 

经过这一周的学习,可以对一个逻辑回归模型有一个比较清楚地了解,下面是完成的作业的一个链接,读者可以自行做做,比较简单,传送门

本笔记是学习Andrew NG课程的学习所完成的,这里只是进行总结,如有有不对,请斧正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习(入门)——逻辑回归模型(Logistics Regression) 的相关文章

随机推荐