深度学习—(线性规划和softmax分类)

学习目标:

学习深度学习的线性回归(第一周)

学习深度学习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)=w^{T}*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*\sum L(xi)=1/n\sum 1/2(w^{T}*x+b-y)^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)。

            梯度下降:\frac{\partial L(x)}{\partial w}=2*(w\sum x^{2}-\sum (y-b)*x)          

                              \frac{\partial L(x)}{\partial b}=2*(m*b-\sum (y-w*x))

\frac{\partial L(x)}{\partial w}=0,  \frac{\partial L(x)}{\partial b}=0时可得到w和b的最优解,所以有

                             w=\sum y(x-avg(x)))  /   \sum x^{2}-1/m(\sum x)^2;

                             b=1/m\sum (y-w*x);

#梯度下降的核心算法
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))/\sum exp(o(k))

                  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 个
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值