逻辑回归梯度下降法向量化

Posted 劳埃德·福杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑回归梯度下降法向量化相关的知识,希望对你有一定的参考价值。

目录

1.二分类(Binary Classification)问题

二分类问题就是简单的“是否”、“有无”问题,例如判断一张图片中是否有猫

对机器来说,分辨这张图,需要读取这幅图的数字特征。

计算机保存一张图片,要保存三个独立矩阵,分别对应红绿蓝三个颜色通道。

我们可以定义一个特征向量x,把图片的所有像素值取出来放到这个特征向量里。如果这个图片是64x64的,那么这个特征向量的总维度n=64x64x3=12288。

识别这张图片,就是以图片的的特征向量x作为输入,预测输出的结果标签y是0还是1。

2.逻辑回归(Logistic Regression)

逻辑回归是一种用于解决二分类问题的机器学习方法,用于估计某种事物的可能性。

:如果我们想要知道一张图片是猫的概率 ŷ。已知特征向量x和logistic回归的两个参数:w(n维向量)和b(实数),如何预测 ŷ ?

? 不行,考虑到0<=ŷ<=1,这样的线性回归很难实现。

所以要在外面套一个sigmoid 函数:

如下图,sigmoid 函数是一条值域在[0,1]的平滑曲线。

为了训练logistic回归模型的参数w和b,需要定义一个成本函数(cost function)

首先,定义一个损失函数(Loss function)来衡量预测值 ŷ 和y的实际值有多近:

。(log省略的底数为10)

显然,我们希望损失函数尽可能地小。

y=0,f(ŷ,y) = -log(1-ŷ),f 要小,ŷ 要尽可能小,考虑到 ŷ 的取值范围,我们希望 ŷ 趋近于0。

y=1,f(ŷ,y) = -ylog(ŷ),f 要小,ŷ 要尽可能大,我们希望 ŷ 趋近于1。

Loss function是在单个训练样本中定义的,它衡量了在单个训练样本上的表现。

cost function 衡量的是在全体训练样本上的表现,如下:

我们的目标就是找到使得成本函数尽可能小的w和b。

为方便绘图,我们假设w和b都是实数,在实践中w可以是更高维的。

为了找到更好的w和b,我们通常给它们一个初始值,然后从初始点开始,向最陡的下坡方向走一步,这就是梯度下降的一次迭代,然后通过不断的迭代,逐渐收敛到全局最优解。

3.梯度下降法

首先,看看梯度下降如何应用到logistic回归的一个训练样本上。(假设w只有2个维度,b为实数)

对m个样本应用梯度下降,具体的一次迭代怎么做?

J=0, dw1=0,dw2=0,...,dwn=0,db=0

for i=1 to m:

:=:=,b:=,α为学习率

4.向量化(Vectorization)

上面的计算,正常需要两个for循环,一个用来遍历m个训练样本,一个用来遍历n个特征(上文的w我们简化成2维的,所以没遍历)。

显式地使用for循环效率很低,向量化运算来代替显式的for循环,能让程序运行地更快

验证:

# 打开cmd
pip install jupyter           # 提前安装好jupyter notebook
pip install ipykernel         # 安装ipykernel包
conda create -n deeplearning  # 创建虚拟环境
conda activate deeplearning   # 进入虚拟环境
conda install -n deeplearning numpy # 安装numpy
deactivate                    # 退出虚拟环境
python -m ipykernel install --name deeplearning # 将deeplearning虚拟环境写入notebook的kernel中
jupyter notebook              # 启动jupyter notebook
# 在jupyter notebook使用虚拟环境,如下图

测试代码

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(c)
print("Vectorized version:" + str(1000*(toc-tic)) + "ms")

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")

5.在逻辑回归上应用向量化

............

np.dot()+b

np.sum(dZ)

W:=,b:=,α为学习率

以上是关于逻辑回归梯度下降法向量化的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow逻辑回归原理与实现(超详细)

《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础

神经网络简介

机器学习之逻辑回归以及梯度下降法求解

机器学习P6 逻辑回归的 损失函数 以及 梯度下降

机器学习100天(十七):017 逻辑回归梯度下降