天津地区个人网站备案,淘宝网站策划怎么做,网站续费公司,如何建立网站快捷文章内容来自BV11H4y1F7uH#xff0c;仅为个人学习所用。 文章目录 二分分类一些符号说明 逻辑斯蒂回归传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^wTxbSigmoid激活函数逻辑斯蒂回归损失函数损失函数成本函数与损失函数的关系 梯度下降法计算图逻辑斯蒂…文章内容来自BV11H4y1F7uH仅为个人学习所用。 文章目录 二分分类一些符号说明 逻辑斯蒂回归传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^wTxbSigmoid激活函数逻辑斯蒂回归损失函数损失函数成本函数与损失函数的关系 梯度下降法计算图逻辑斯蒂回归中的梯度下降法单个样本下的梯度下降m个样本的梯度下降 向量化向量化技术向量化技术计算m个训练数据的梯度 numpy的向量 二分分类
假设有一张图片作为输入判断该图片是不是猫如果是猫输出1否则输出0。用 x x x表示输入 y y y表示输出。 图片在计算机中用三个二维矩阵分别表示RGB。假设该图片像素大小为64*64那么矩阵行*列为64*64。这里为了简单起见画出3个5*4的矩阵。 将这些值放入一个特征向量 x \boldsymbol{x} x有 x [ 255 . . . 202 255 . . . 94 255 . . . 142 ] \boldsymbol{x}\begin{bmatrix}255\\...\\202\\255\\...\\94\\255\\...\\142\end{bmatrix} x 255...202255...94255...142
对于64*64的三张图片总维度大小为64*64*312288有 n n x 12288 nn_x12288 nnx12288
使用 n x n_x nx表示输入的特征向量的维度简单起见用 n n n代替。
一些符号说明 ( x , y ) (\boldsymbol{x}, y) (x,y)表示一个单独的样本。其中 x \boldsymbol{x} x是 n n n维的特征向量 y y y是标签值为 { 0 , 1 } \{{0,1\}} {0,1}。 m m m表示训练集由 m m m个样本构成 ( x ( 1 ) , y ( 1 ) ) (\boldsymbol{x}^{(1)},y^{(1)}) (x(1),y(1))表示样本一的输入输出 ( x ( 2 ) , y ( 2 ) ) (\boldsymbol{x}^{(2)},y^{(2)}) (x(2),y(2))表示样本二的输入输出 ( x ( 1 ) , y ( 1 ) ) (\boldsymbol{x}^{(1)},y^{(1)}) (x(1),y(1))… ( x ( m ) , y ( m ) ) (\boldsymbol{x}^{(m)},y^{(m)}) (x(m),y(m))表示整个训练集。 m t r a i n m_{train} mtrain可以表示为训练集的样本个数。 m t e s t m_{test} mtest可以表示为测试集的样本个数。 使用更为方便的符号 X [ ∣ ∣ ∣ x ( 1 ) x ( 2 ) x ( 3 ) ∣ ∣ ∣ ] \boldsymbol{X}\begin{bmatrix}|||\\x^{(1)}x^{(2)}x^{(3)}\\|||\end{bmatrix} X ∣x(1)∣∣x(2)∣∣x(3)∣ 表示训练集该矩阵有 m m m列有 n n n行。使用符号 Y [ y ( 1 ) y ( 2 ) . . . y ( m ) ] \boldsymbol{Y}\begin{bmatrix} y^{(1)} y^{(2)} ...y^{(m)} \end{bmatrix} Y[y(1)y(2)...y(m)]表示输出标签。 py中X.shape()函数用于输出矩阵的维度。对于 X \boldsymbol{X} X输出结果为 ( n x , m ) (n_x,m) (nx,m)对于 Y \boldsymbol{Y} Y输出结果为 ( 1 , m ) (1,m) (1,m)。 逻辑斯蒂回归
传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^wTxb
Logistics回归是一个学习算法用于在监督学习问题中输出标签是0或1时。这是一个二元分类问题。
已知输入特征向量 x \boldsymbol{x} x可能是一张图片希望识别出是不是猫的图片。根据某个算法得出预测值 y ^ \hat{y} y^当输入特征值满足条件的时候 y ^ \hat{y} y^是1。这里的 x \boldsymbol{x} x是一个 n x n_x nx维的向量。
Logistics回归的参数中 w \boldsymbol{w} w也是一个 n x n_x nx维的向量 b b b是一个实数。使用传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^wTxb并不是一个很好的二元分类算法。 y ^ \hat{y} y^应该落入0~1之间但是这个函数并不在此区间。
Sigmoid激活函数
Sigmoid激活函数表达式为 S ( x ) 1 1 e − x S(x)\frac{1}{1e^{-x}} S(x)1e−x1 Sigmoid 函数将输入的任意实数映射到区间(0,1)内这一特性使得它在很多情况下可用于将输入转换为表示概率的输出因此在二分类问题中应用广泛。
逻辑斯蒂函数表达式为 P ( x ) 1 1 e − ( a b x ) P(x)\frac{1}{1e^{-(abx)}} P(x)1e−(abx)1当a0b1时就是标准的Sigmoid激活函数Sigmoid激活函数是逻辑斯蒂函数的一个特例通常使用 σ ( x ) \sigma(x) σ(x)表示。
使用Sigmoid激活函数作用到该表达式中有预测值 y ^ σ ( w T x b ) \hat{y}\sigma(w^T\boldsymbol{x}b) y^σ(wTxb)
逻辑斯蒂回归损失函数
对于函数 y ^ σ ( w T x b ) \hat{y}\sigma(w^T\boldsymbol{x}b) y^σ(wTxb)给定训练集 ( x ( 1 ) , y ( 1 ) ) (\boldsymbol{x}^{(1)},y^{(1)}) (x(1),y(1))… ( x ( m ) , y ( m ) ) (\boldsymbol{x}^{(m)},y^{(m)}) (x(m),y(m))想要得到 y ( i ) ^ ≐ y ( i ) \hat{y^{(i)}}\doteq y^{(i)} y(i)^≐y(i)。
损失函数
损失函数Loss Function是用于衡量模型预测值与真实值之间差异的函数。
损失函数的值越小表示模型的预测结果与真实结果越接近。在模型训练过程中通过不断地调整模型的参数如神经网络中的权重和偏置使损失函数的值逐渐减小从而使模型不断优化提高预测的准确性。损失函数还可以用于评估不同模型或同一模型在不同参数设置下的性能。通常在验证集或测试集上计算损失函数的值值越小的模型性能越好。
一些常见的损失函数如下
均方误差Mean Squared ErrorMSE 公式 M S E 1 n ∑ i 1 n ( y i − y ^ i ) 2 MSE \frac{1}{n}\sum_{i1}^{n}(y_i - \hat{y}_i)^2 MSEn1∑i1n(yi−y^i)2其中 n n n是样本数量 y i y_i yi是真实值 y ^ i \hat{y}_i y^i是预测值。应用场景常用于回归问题例如预测房价、股票价格等连续值的预测任务。它对较大的误差给予更大的惩罚因为误差是平方的所以能使模型更关注较大的偏差。特点计算简单导数也容易计算方便使用梯度下降等优化算法进行优化。但对异常值比较敏感因为异常值的平方会使损失值增大很多。 交叉熵损失Cross-Entropy Loss 二分类情况 公式 C E − 1 n ∑ i 1 n [ y i log ( y ^ i ) ( 1 − y i ) log ( 1 − y ^ i ) ] CE -\frac{1}{n}\sum_{i1}^{n}[y_i\log(\hat{y}_i) (1 - y_i)\log(1 - \hat{y}_i)] CE−n1∑i1n[yilog(y^i)(1−yi)log(1−y^i)]其中 y i y_i yi取值为0或1 y ^ i \hat{y}_i y^i是模型预测样本 i i i为正类的概率。 注意这里的 l o g log log是国外的写法实际上是 l n ln ln 应用场景广泛应用于二分类问题如垃圾邮件分类、疾病诊断等。当真实标签 y i 1 y_i 1 yi1时损失函数只与 log ( y ^ i ) \log(\hat{y}_i) log(y^i)有关模型会尽量使 y ^ i \hat{y}_i y^i接近1当 y i 0 y_i 0 yi0时损失函数只与 log ( 1 − y ^ i ) \log(1 - \hat{y}_i) log(1−y^i)有关模型会尽量 y ^ i \hat{y}_i y^i接近0。特点能够很好地反映模型预测的概率分布与真实分布之间的差异并且在梯度计算上比较方便有利于模型的快速收敛。
成本函数
成本函数是一个用于衡量机器学习模型性能的函数它通常是关于模型参数的函数其值表示模型在训练数据上的性能表现。成本函数的值越低通常表示模型在训练数据上的表现越好。
与损失函数的关系
成本函数和损失函数密切相关在许多情况下它们可能会被混淆使用。损失函数通常是针对单个训练样本计算的误差而成本函数是对整个训练数据集上的损失函数值进行求和或平均。损失函数侧重于衡量单个样本预测的误差而成本函数是对整个训练集的总体误差度量它是优化算法在训练过程中需要最小化的目标。
常见的成本函数对于二分类问题 J ( w , b ) − 1 m ∑ i 1 m [ y ( i ) log ( y ^ ( i ) ) ( 1 − y ( i ) ) log ( 1 − y ^ ( i ) ] J(\boldsymbol{w}, b)-\frac{1}{m}\sum_{i1}^{m}[y^{(i)}\log(\hat{y}^{(i)} )(1 - y^{(i)})\log(1 - \hat{y}^{(i)}] J(w,b)−m1∑i1m[y(i)log(y^(i))(1−y(i))log(1−y^(i)]。
综上Logistics函数可以看作一个非常小的神经网络。
梯度下降法
对于函数 现在需要做的就是找到合适的 w \boldsymbol{w} w与b使得成本函数 J J J的值最小。 w \boldsymbol{w} w是一个向量为了简单起见这里认为是实数b也是实数。可以看到成本函数 J J J是一个凸函数注意是这里是西方的说法开口向上的曲线称为上凹或称为下凸。视频中讲上凸或下凸。
梯度下降在图像上直观理解图片中红色部分从任意一点沿着某条路径到达最小值。 对于一维的成本函数 使用梯度下降 w : w − α d J ( w ) d x w:w-\alpha\frac{\mathrm{d}J(w)}{\mathrm{d}x} w:w−αdxdJ(w)反复计算来更新 w w w的值:表示更新 w w w的值。
计算图
举例 J ( a , b , c ) 3 ( a b c ) J(a,b,c)3(abc) J(a,b,c)3(abc)计算过程如下 u b c ubc ubc v a u vau vau J 3 v J3v J3v 画出流程图从左到右是正向传播可以计算出 J J J的值。 从右到左是反向传播可以求导链式法则。 d J d v ( 3 v ) ′ 3 \frac{\mathrm{d} J}{\mathrm{d} v}(3v)3 dvdJ(3v)′3 d J d a d J d v d v d a ( 3 v ) ′ ( a u ) ′ 3 \frac{\mathrm{d} J}{\mathrm{d} a}\frac{\mathrm{d} J}{\mathrm{d} v}\frac{\mathrm{d} v}{\mathrm{d} a}(3v)(au)3 dadJdvdJdadv(3v)′(au)′3 d J d u d J d v d v d u ( 3 v ) ′ ( a u ) ′ 3 \frac{\mathrm{d} J}{\mathrm{d} u}\frac{\mathrm{d} J}{\mathrm{d} v}\frac{\mathrm{d} v}{\mathrm{d} u}(3v)(au)3 dudJdvdJdudv(3v)′(au)′3 d J d b d J d v d v d u d u d b ( 3 v ) ′ ( a u ) ′ ( b c ) ′ 3 c \frac{\mathrm{d} J}{\mathrm{d} b}\frac{\mathrm{d} J}{\mathrm{d} v}\frac{\mathrm{d} v}{\mathrm{d} u}\frac{\mathrm{d} u}{\mathrm{d} b}(3v)(au)(bc)3c dbdJdvdJdudvdbdu(3v)′(au)′(bc)′3c d J d c d J d v d v d u d u d c ( 3 v ) ′ ( a u ) ′ ( b c ) ′ 3 b \frac{\mathrm{d} J}{\mathrm{d} c}\frac{\mathrm{d} J}{\mathrm{d} v}\frac{\mathrm{d} v}{\mathrm{d} u}\frac{\mathrm{d} u}{\mathrm{d} c}(3v)(au)(bc)3b dcdJdvdJdudvdcdu(3v)′(au)′(bc)′3b 为了编程的方便定义 d v d J d v \mathrm{d}v\frac{\mathrm{d} J}{\mathrm{d} v} dvdvdJ、 d a d J d a \mathrm{d}a\frac{\mathrm{d} J}{\mathrm{d} a} dadadJ…
逻辑斯蒂回归中的梯度下降法
单个样本下的梯度下降
对于Logistic回归的公式 假设样本只有两个特征 x 1 x1 x1、 x 2 x2 x2。为了计算 z z z需要输入 w 1 w1 w1、 w 2 w2 w2和 b b b。 反向传播进行计算有 ′ ′ d a ′ ′ d L d a − y a 1 − y 1 − a \mathrm{d}a\frac{\mathrm{d}L}{\mathrm{d}a}-\frac{y}{a}\frac{1-y}{1-a} ′′da′′dadL−ay1−a1−y d a d z e − x ( 1 e − x ) 2 a ( 1 − a ) \frac{\mathrm{d}a}{\mathrm{d}z}\frac{e^{-x}}{(1e^{-x})^2}a(1-a) dzda(1e−x)2e−xa(1−a) ′ ′ d z ′ ′ d L d z d L d a d a d z ( − y a 1 − y 1 − a ) ( a ( 1 − a ) ) a − y \mathrm{d}z\frac{\mathrm{d}L}{\mathrm{d}z}\frac{\mathrm{d}L}{\mathrm{d}a}\frac{\mathrm{d}a}{\mathrm{d}z}(-\frac{y}{a}\frac{1-y}{1-a})(a(1-a))a-y ′′dz′′dzdLdadLdzda(−ay1−a1−y)(a(1−a))a−y d L d w 1 d L d a d a d z d z d w 1 d L d z x 1 x 1 d z \frac{\mathrm{d}L}{\mathrm{d}w_1}\frac{\mathrm{d}L}{\mathrm{d}a}\frac{\mathrm{d}a}{\mathrm{d}z}\frac{\mathrm{d}z}{\mathrm{d}w_1} \frac{\mathrm{d}L}{\mathrm{d}z}x_1x_1\mathrm{d}z dw1dLdadLdzdadw1dzdzdLx1x1dz d L d w 2 d L d a d a d z d z d w 2 d L d z x 2 x 2 d z \frac{\mathrm{d}L}{\mathrm{d}w_2}\frac{\mathrm{d}L}{\mathrm{d}a}\frac{\mathrm{d}a}{\mathrm{d}z}\frac{\mathrm{d}z}{\mathrm{d}w_2} \frac{\mathrm{d}L}{\mathrm{d}z}x_2x_2\mathrm{d}z dw2dLdadLdzdadw2dzdzdLx2x2dz d L d b d L d a d a d z d z d b d L d z d z \frac{\mathrm{d}L}{\mathrm{d}b}\frac{\mathrm{d}L}{\mathrm{d}a}\frac{\mathrm{d}a}{\mathrm{d}z}\frac{\mathrm{d}z}{\mathrm{d}b} \frac{\mathrm{d}L}{\mathrm{d}z}\mathrm{d}z dbdLdadLdzdadbdzdzdLdz 梯度下降计算有 w 1 : w 1 − α d w 1 w_1:w_1-\alpha\mathrm{d}w_1 w1:w1−αdw1 w 2 : w 2 − α d w 2 w_2:w_2-\alpha\mathrm{d}w_2 w2:w2−αdw2 b : b − α d b b:b-\alpha\mathrm{d}b b:b−αdb
m个样本的梯度下降
对于 m m m个样本在编程时令 J 0 J0 J0 d w 1 0 \mathrm{d}w_10 dw10 d w 2 0 \mathrm{d}w_20 dw20 d w . . . 0 \mathrm{d}w...0 dw...0、 d b 0 \mathrm{d}b0 db0 伪代码如下 该伪代码有两层for时间复杂度较大。因此需要使用向量化技术来摆脱显式的for循环。
向量化
对于 z w T x b z\boldsymbol{w}^T\boldsymbol{x}b zwTxb其中 w \boldsymbol{w} w、 x \boldsymbol{x} x都是列向量。在py中使用np.dot()方法就可以实现向量化技术。通过代码来感受向量化与非向量化之间的差距。
import numpy as np
import time# 生成一个包含 1000000 个元素的一维数组数组中的元素是在范围 [0, 1) 内均匀分布的随机浮点数。
a np.random.rand(1000000)
b np.random.rand(1000000)# 向量化
tic time.time()
c np.dot(a, b)
toc time.time()print(c)
print(toc - tic)# 非向量化
c 0
ticc time.time()
for i in range(1000000):c a[i]*b[i]
tocc time.time()print(c)
print(tocc - ticc)因此能使用numpy库的向量化技术的就不要使用for之类的循环。
关于向量化技术部分光听理论比较抽象最好通过吴恩达配套的作业进行编码加深理解。
向量化技术 训练集 X [ ∣ ∣ ∣ x ( 1 ) x ( 2 ) x ( 3 ) ∣ ∣ ∣ ] \boldsymbol{X}\begin{bmatrix}|||\\x^{(1)}x^{(2)}x^{(3)}\\|||\end{bmatrix} X ∣x(1)∣∣x(2)∣∣x(3)∣ 代入公式分别计算Z和a有 Z [ z ( 1 ) z ( 2 ) z ( 3 ) . . . ] w T X b [ w T x ( 1 ) w T x ( 2 ) w T x ( 3 ) . . . ] [ b b b . . . ] \boldsymbol{Z}\begin{bmatrix}z^{(1)} z^{(2)} z^{(3)}...\end{bmatrix}\boldsymbol{w}^T\boldsymbol{X}b \begin{bmatrix}w^Tx^{(1)} w^Tx^{(2)} w^Tx^{(3)}...\end{bmatrix}\begin{bmatrix}b b b...\end{bmatrix} Z[z(1)z(2)z(3)...]wTXb[wTx(1)wTx(2)wTx(3)...][bbb...]使用向量化技术有 Z n p . d o t ( w T , x ) b \boldsymbol{Z}np.dot(w^T, x) b Znp.dot(wT,x)b在这里的b使用到了py中的广播是py的语法。
计算出的 Z \boldsymbol{Z} Z代入a有 A [ a ( 1 ) a ( 2 ) a ( 3 ) . . . ] \boldsymbol{A}\begin{bmatrix}a^{(1)} a^{(2)} a^{(3)}...\end{bmatrix} A[a(1)a(2)a(3)...]
向量化技术计算m个训练数据的梯度 之前对 d w \mathrm{d}w dw做了向量化现在要进一步消去for
numpy的向量
import numpy as np# 生成5个随机高斯变量存在数组a中
# 秩为1的数组一维数组有5个数据
# 既不是行向量也不是列向量
a np.random.randn(5)
print(a.shape)
print(a)
print(np.dot(a, a.T))# 5*1的列向量
b np.random.randn(5, 1)
print(b.shape)
print(b)
print(b.T)
print(np.dot(b, b.T))不要使用第一种方式创建数据它是一个数组而不是向量应该使用第二种方式创建数据。