Sigmoid function函数(函数值[-1, 1 ],单调递增)
1、Logistic Function(Logistic 函数),(最广泛):
x取值范围 [-无穷, +无穷], 函数值的范围 [0,1],使得函数值相当于是一个概率值。一般把函数模型输出值(如:y = w * x + b)当作Logistic 函数中的 x 值,从而得到一个概率值。
2、Logistic 函数曲线图:
2、还有其它属于Sigmoid functions的函数:
3、我们知道线性回归(Linear Regression)的损失函数为:loss = (y_pred - y) ** 2 = (x * w - y) ** 2 ,这更是求两个值的距离差。相对于线性回归损失函数,二值化分类(Binary Classification)损失函数(BCELoss):loss = - (y * log(y_pred) + (1 - y) * log(1 - y_pred) )。其中线性回归函数中的 y 和 y_pred 是几何距离差异,二值化分类函数中的 y 和 y_pred 是分布差异(非0,即1)。
- 令 y =1, 损失函数可以写成:loss = - log(y_pred),要使loss最小,y_pred取值要最大(取1);
- 令 y =0, 损失函数可以写成:loss = log(1 - y_pred),要使loss最小,y_pred取值要最小(取0);
- 当真实为y,预测值(y)越接近y值,BCE Loss损失函数越小;
4、完整代码:
import torch
import torch.nn.functional as F
# 准备数据
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]]) # 第0类,第1类
# 设计Logistic回归模型
class LogisticRegressionModel(torch.nn.Module):
def __init__(self):
super(LogisticRegressionModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = F.sigmoid(self.linear(x)) # 对self.linear(x)进行非线性变化
return y_pred
# 想使用模型,就实例化即可,可以直接调用
model = LogisticRegressionModel()
# 令 y =1, BCELoss损失函数可以写成:loss = - log(y_pred),要使loss最小,参数调整(权重w和偏置b),y_pred取值要最大(取1)
# 令 y =0, BCELoss损失函数可以写成:loss = log(1 - y_pred),要使loss最小,参数调整(权重w和偏置b),y_pred取值要最小(取0)
# 当真实为y,预测值(y)越接近y值,BCE Loss损失函数越小
# 构建损失函数、优化器
criterion = torch.nn.BCELoss(size_average=False) # BCE损失
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # # model.parameters(),检查model所有的权重;lr:学习率
# 循环训练
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
# print("迭代第:",epoch, "y_pred = ", y_pred, "损失值 = ", loss.item())
print("迭代第:{}, y_pred = {}, 损失值 = {}".format(epoch, y_pred, loss.item())) # 进行非线性变化得到y_pred
optimizer.zero_grad() # 梯度归零
loss.backward() # 反向传播
optimizer.step() # 参数优化更新(根据学习率lv:0.01更新)
print('w = ',model.linear.weight.item())
print('b = ', model.linear.bias.item())
x_test = torch.Tensor([4])
y_test = model(x_test)
print(("当 x_test = 4 时,y_pred = 1 的概率:{}").format(y_test.data))
运行结果:
根据x,y的数据:
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]]) # 第0类,第1类
预测当x_test = torch.Tensor([4.0])时,
每次训练更新的权重w、b可能会不同。
输入x = 4,y_pred = 0.86821
带入其他数据,绘制下图。
参考了Lecturer: Hongpu Liu主讲的视频。