sigmoid 函数的损失函数与参数更新

简介: 1 sigmoid 函数的损失函数与参数更新 逻辑回归对应线性回归,但旨在解决分类问题,即将模型的输出转换为 $[0, 1]$ 的概率值。逻辑回归直接对分类的可能性进行建模,无需事先假设数据的分布。最理想的转换函数为单位阶跃函数(也称 Heaviside 函数),但单位阶跃函数是不连续的,没法在实际计算中使用。

1 sigmoid 函数的损失函数与参数更新

逻辑回归对应线性回归,但旨在解决分类问题,即将模型的输出转换为 $[0, 1]$ 的概率值。逻辑回归直接对分类的可能性进行建模,无需事先假设数据的分布。最理想的转换函数为单位阶跃函数(也称 Heaviside 函数),但单位阶跃函数是不连续的,没法在实际计算中使用。故而,在分类过程中更常使用对数几率函数(即 sigmoid 函数):

$$ \sigma(x) = \frac{1}{1+e^{-x}} $$

易推知,$\sigma(x)' = \sigma(x)(1- \sigma(x))$.

假设我们有 $m$ 个样本 $D = \{(x_i, y_i)\}_i^m$, 令 $X = (x_1, x_2, \cdots, x_m)^T, y = (y_1, y_2, \cdots, y_m)^T$, 其中 $x_i \in \mathbb{R}^n, y_i \in \{0, 1\}$, 关于参数 $w \in \mathbb{R}^n, b \in \mathbb{R}$, ($b$ 需要广播操作),我们定义正例的概率为

$$ P(y_j=1|x_j;w,b) = \sigma(x_j^Tw +b) = \sigma(z_j) $$

这样属于类别 $y$ 的概率可改写为

$$ P(y_j|x_j;w,b) = \sigma(z_j)^{y_j}(1-\sigma(z_j))^{1-y_j} $$

令 $z = (z_1, \cdots, z_m)^T$, 则记 $h(z) = (\sigma(z_1), \cdots, \sigma(z_m))^T$, 且 Logistic Regression 的损失函数为

$$ \begin{aligned} L(w, b) =& - \displaystyle \frac{1}{m} \sum_{i=1}^m (y_i \log (\sigma(z_i)) +(1-y_i) \log (1 - \sigma(z_i)))\\ =& - \frac{1}{m} (y^T\log (h(z)) + (\mathbf{1}-y)^T\log(\mathbf{1}- h(z))), \text{ 此时做了广播操作} \end{aligned} $$

这样,我们有

$$ \begin{cases} \nabla_w L(w,b) = \frac{\text{d}z}{\text{d}w} \frac{\text{d}L}{\text{d}z} = - \frac{1}{m}X^T(y-h(z))\\ \nabla_b L(w,b) = \frac{\text{d}z}{\text{d}b} \frac{\text{d}L}{\text{d}z} = - \frac{1}{m}\mathbf{1}^T(y-h(z)) \end{cases} $$

其中,$\mathbf{1}$ 表示全一列向量。这样便有参数更新公式 ($\eta$ 为学习率):

$$ \begin{cases} w \leftarrow w - \eta \nabla_{w} L(w,b)\\ b \leftarrow b - \eta \nabla_b L(w,b) \end{cases} $$

更多机器学习中的数见:机器学习中的数学

目录
相关文章
|
6天前
|
机器学习/深度学习 Python
sigmoid函数
本文探讨了高等数学中的sigmoid函数,它在神经网络中的应用,特别是在二分类问题的输出层。sigmoid函数公式为 $\frac{1}{1 + e^{-x}}$,其导数为 $sigmoid(x)\cdot(1-sigmoid(x))$。文章还展示了sigmoid函数的图像,并提供了一个使用Python绘制函数及其导数的代码示例。
10 2
|
28天前
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中非标量调用backward()的时候为什么要先进行sum操作
在《动手学深度学习》第二版教程中,当y为非标量的时候,调用backward()函数时,为什么先要求和呢(即y.sum().backward()),估计很多读者有点懵,今天小编给大家说说我的理解。
177 3
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
base model初始化large model,造成的参数矩阵对不上权重不匹配问题+修改预训练权重形状和上采样
base model初始化large model,造成的参数矩阵对不上权重不匹配问题+修改预训练权重形状和上采样
107 0
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch学习笔记(6):模型的权值初始化与损失函数
Pytorch学习笔记(6):模型的权值初始化与损失函数
151 0
Pytorch学习笔记(6):模型的权值初始化与损失函数
|
算法
单变量批量梯度下降算法与单变量随机梯度下降算法
通过这些图形,我希望你能更好地理解这些代价函数J所表达的值是什么样的,它们对应的假设是什么样的,以及什么样的假设对应的点,更接近于代价函数的最小值。
85 0
torch 如何在迭代训练中,只计算参数梯度,不更新参数。并且将参数的梯度保存到列表,这个列表的值不随着梯度清零而跟着变为零
在使用 torch.autograd.backward() 计算梯度后,可以通过设置参数的 requires_grad 属性为 False 来阻止参数更新。同时,通过将计算出的梯度值放入一个列表中来保存,这个列表的值不会随着梯度清零而清零
581 0
|
PyTorch 算法框架/工具
已经定义好了一个张量,如何增加代码要求计算梯度?
在 PyTorch 中,可以使用 requires_grad_() 方法来动态设置张量的 requires_grad 属性为 True,从而要求计算梯度。具体来说,对于已经创建的张量 x,可以通过调用 x.requires_grad_() 来将其设置为需要计算梯度的张量。
258 0
torch中 参数的梯度值赋值给新的变量,并且要求这个变量的值不会随着梯度清零而变零
可以使用 detach() 方法来将参数的梯度值赋值给一个新的变量,并且确保这个变量的值不会随着梯度清零而变为零。
281 0
|
索引
在训练模型每次迭代中,打印参数的梯度
要打印出每个迭代中的所有样本梯度,您需要在代码中进行相应的更改。以下是一个示例过程,可以帮助您实现此目标: 1. 在训练循环中,使用 enumerate() 函数迭代数据集中的每个批次,并获取每个批次的索引和数据。
613 0
|
机器学习/深度学习 缓存 监控
Pytorch学习笔记-04 权值初始化与损失函数
Pytorch学习笔记-04 权值初始化与损失函数
99 0
Pytorch学习笔记-04 权值初始化与损失函数

热门文章

最新文章