学习目标:
学习深度学习的线性回归(第一周)
学习深度学习softmax分类(第二周)
学习内容:
一.线性回归
1.预测函数:f(x)=w1*x1+w2*x2+....+wn*xn+b;
其中x1,x2...xn称为影响函数f(x)的特征量,预测函数f(x)称为标签;
其中w1,w2..wn为其对应的特征量x1,x2...xn所对应的权重值
用向量形式表示:f(x)=*x+b;
w=(w1,w2,w3.......Wn); x=(x1,x2,x3....xn);
2.损失函数
假设其真实的函数为 y;
则损失函数:L(x)=1/2(f(x)-y)^2;
损失函数L(x)越小,则说明预测函数f(x)与真实函数y越接近,所以可以通过损失函数来预测f(x)的拟合度,当拟合到一定的程度时,则可以说明预测函数f(x)就是真实函数y;
3.下面开始来建设回归模型
(1).数据预处理:标准化/归一化处理,或者对属性离散化处理。
(2)建立线性回归模型,初始化模型参数。(这里可以先随便假设w1,w2..wn的值,然后根据数据x=(x1,x2...xn)得到预测函数发(x))
(3)定义线性回归模型的损失函数(L(x)),并利用初始值算出L(x)。当有多组样本时
L(x)=1/n*=1/n
^2;
#定义损失函数L(x);
def compute_cost(w, b, data):
total_cost = 0
M = len(data)
# 逐点计算平方损失误差,然后求平均数
for i in range(M):
x = data[i, 0]
y = data[i, 1]
total_cost += (y - w * x - b) ** 2
return total_cost / M
(4)计算损失函数对模型参数的梯度,并利用梯度下降的方法更行损失函数L(x),也就是对每个特征量x的权重值w进行更新。(当损失函数L(x)小到一定范围时,则可说明预测函数f(x)就是真实函数y)。
梯度下降:=2*(w
-
)
=2*(m*b-
)
当=0,
=0时可得到w和b的最优解,所以有
w= /
-1/m(
)^2;
b=1/m;
#梯度下降的核心算法
def grad_desc(data, initial_w, initial_b, alpha, num_iter):
w = initial_w
b = initial_b
# 定义一个list保存所有的损失函数值,用来显示下降的过程
cost_list = []
for i in range(num_iter):
cost_list.append(compute_cost(w, b, data))
w, b = step_grad_desc(w, b, alpha, data)
return [w, b, cost_list]
def step_grad_desc(current_w, current_b, alpha, data):
sum_grad_w = 0
sum_grad_b = 0
M = len(data)
# 对每个点,代入公式求和
for i in range(M):
x = data[i, 0]
y = data[i, 1]
sum_grad_w += (current_w * x + current_b - y) * x
sum_grad_b += current_w * x + current_b - y
# 用公式求当前梯度
grad_w = 2 / M * sum_grad_w
grad_b = 2 / M * sum_grad_b
# 梯度下降,更新当前的w和b
updated_w = current_w - alpha * grad_w
updated_b = current_b - alpha * grad_b
return updated_w, updated_b
(5)重复(3)(4)的步骤,直到模型收敛(损失函数L(x)不再变化或变化不大)或达到了指定的迭代次数,停止迭代,此时获得的模型参数(w1,w2....wn,b)为最终的线性回归模型参数。(训练模型)
(6)利用训练模型对测试数据进行预测测试(测试模型)。
二.softmax分类
softmax分类是对于逻辑分类的改进,逻辑分类只能辨别两个标签,而softmax分类可以辨别多个标签。
(1)我们从⼀个图像分类问题开始。假设每次输⼊是⼀个2×2的灰度图像。我们可以⽤⼀个标量表⽰每个像素值,每个图像对应四个特征x1,x2,x3,x4。此外,假设每个图像属于类别“猫”“鸡”和“狗”中的⼀个。
(2)独热编码(one-hotencoding)。独热编码是⼀个向量,它的分量和类别⼀样多。类别对应的分量设置为1,其他所有分量设置为0。在我们的例⼦中,标签y将是⼀个三维向量,其中(1,0,0)对应于“猫”、(0,1,0)对应于“鸡”、(0,0,1)对于“狗”:
y∈{(1,0,0),(0,1,0),(0,0,1)}.
(3)为了估计所有可能类别的条件概率,我们需要⼀个有多个输出的模型,每个类别对应⼀个输出。为了解决线性模型的分类问题,我们需要和输出⼀样多的仿射函数(affinefunction)。每个输出对应于它⾃⼰的仿射函数。在我们的例⼦中,由于我们有4个特征和3个可能的输出类别,我们将需要12个标量来表⽰权重(带下标的w),3个标量来表⽰偏置(带下标的b)。下⾯我们为每个输⼊计算三个未规范化的预测(logit):o1、o2和o3。(o1代表是猫的概率,o2代表是鸡的概率,o3代表是狗的概率)
o1=x1w11+x2w12+x3w13+x4w14+b1,
o2=x1w21+x2w22+x3w23+x4w24+b2,
o3=x1w31+x2w32+x3w33+x4w34+b3.
用向量来表示就是 O=WX+B;(w代表权重,x代表给定数据样本的特征,b代表偏置,我们最终的目的就是通过迭代来找到合适的w);
(4)softmax函数
社会科学家邓肯·卢斯于1959年在选择模型(choice model)的理论基础上发明的soffmax函数正是这样做的:soffmax函数能够将未规范化的预测变换为⾮负数并且总和为1,同时让模型保持可导的性质。为了完成这⼀ ⽬标,我们⾸先对每个未规范化的预测求幂,这样可以确保输出⾮负。为了确保最终输出的概率值总和为1, 我们再让每个求幂后的结果除以它们的总和。
如下式: y^=softmax(O); y(i)=exp(o(j))/
y^=(y(1) y(2) y(3) ........y(i));
这⾥,对于所有的j总有0 ≤ yˆj ≤ 1。因此,yˆ可以视为⼀个正确的概率分布。soffmax运算不会改变未规范化 的预测o之间的⼤⼩次序,只会确定分配给每个类别的概率。因此,在预测过程中,我们仍然可以⽤下式来选 择最有可能的类别。
argmax(y^(j))=argmax(o(j));
尽管soffmax是⼀个⾮线性函数,但soffmax回归的输出仍然由输⼊特征的仿射变换决定。因此,soffmax回 归是⼀个线性模型(linear model)。
为了提⾼计算效率并且充分利⽤GPU,我们通常会对⼩批量样本的数据执⾏⽮量计算。假设我们读取了⼀个 批量的样本X,其中特征维度(输⼊数量)为d,批量⼤⼩为n。此外,假设我们在输出中有q个类别。那么⼩ 批量样本的特征为X ∈ R n×d,权重为W ∈ R d×q,偏置为b ∈ R 1×q。soffmax回归的⽮量计算表达式为:
O = XW + b,
Yˆ = softmax(O)
(5)损失函数及其倒数
下面是对其的实现
def softmax(X):
X_exp = torch.exp(X)
partition = X_exp.sum(1, keepdim=True)
return X_exp / partition # 这⾥应⽤了⼴播机制
#softmax函数的实现
import numpy as np
def softmax(x):
"""Compute the softmax of vector x."""
exp_x = np.exp(x - np.max(x)) # 防止指数溢出
return exp_x / exp_x.sum(axis=0)
#损失函数(交叉熵损失函数常用于评估预测概率分布与实际分布之间的差异)
def cross_entropy_loss(y_pred, y_true):
"""Compute the cross-entropy loss."""
# 只取实际类别对应的概率的负对数
loss = -np.sum(y_true * np.log(y_pred + 1e-9)) # 加入小数防止log(0)
return loss / y_true.shape[0]
学习时间:
周一至周五晚上 7 点—晚上9点
学习产出:
提示:这里统计学习计划的总量
例如:
- 技术笔记 2 遍
- 优快云 技术博客 3 篇
- 习的 vlog 视频 1 个