查看全课大纲(第 37 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
逻辑回归(1):把线性模型接到分类上
约 21 分钟
小象实战讲义 · 机器学习算法精讲
上一节我们给 linear model 配齐了两副眼镜:几何的(投影)与概率的(极大似然)。本节是线性模型一章的收官,也是承前启后的一步:给线性组合接上一个 S 形函数,让它从”预测数值”走向”输出概率、完成分类”。我们从”学习多久才能通过考试”这个直观问题讲起,推出 Sigmoid 与几率(odds)这对核心概念,再把模型用到 IMDb 影评的情感分类上——最后看一篇讲师学生写的真实论文,看逻辑回归学出的”词的情感权重”长什么样。
💡 核心导读
- 名字澄清:Logistic 音译是”逻辑斯特回归”;西瓜书称”对数几率回归”——名为回归,实为二分类。
- Sigmoid 函数:,把任意实数压进 , 时恰为 0.5 中心值。
- 模型结构:线性组合 装进指数函数—— 里头是线性拟合,外头看是非线性映射。
- 本质:真正拟合的是对数几率 ;odds 等于 1,就是五五开。
- 应用:IMDb 影评情感分类——每个词学一个情感权重,特征从词频升级到 TF-IDF。
名字与定位:为什么”回归”做的是分类
先解决名字问题。Logistic regression,音译叫逻辑斯特回归——讲师特意强调,“逻辑回归”其实是偷懒的简称,严格说该念全称。周志华老师在他的《机器学习》(大家熟悉的”西瓜书”)里把它译作对数几率回归——这是一个更准确的叫法。为什么更准确?先卖个关子,本节中段揭晓,到时你会发现这个名字起得名副其实。
再解决定位问题。名字里虽然有 regression——大家记住,regression 是拟合的意思——但逻辑回归实际做的并不完全是拟合,它做的是分类,而且是二分类:输出一个 0 到 1 之间的数当作概率,大于 0.5 判为一类、小于 0.5 判为零类,0.5 就是它的中心值。至于多分类,那就轮到 Softmax 登场了——下一节《逻辑回归(2)》会单独展开,这里先记住:逻辑回归是二分类问题。
从考试说起:0 和 1 之间的连续函数
假设有一个特别简单的数据集:你学习了多长时间,对应你有没有通过考试。课件给了完整的一组数据(20 名学生):
| 学生 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 学习时长(小时) | 0.5 | 0.75 | 1.0 | 1.25 | 1.5 | 1.75 | 1.75 | 2.0 | 2.25 | 2.5 |
| 是否通过 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
| 学生 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
|---|---|---|---|---|---|---|---|---|---|---|
| 学习时长(小时) | 2.75 | 3.0 | 3.25 | 3.5 | 4.0 | 4.25 | 4.5 | 4.75 | 5.0 | 5.5 |
| 是否通过 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
先看两头:学 0.5 小时的挂了;学习 4 小时、4.5 小时、5 小时以上的,全都通过了。再看中间——有意思的地方来了:1.75 小时这位成功了,但 2 小时那位反而 fail 掉;同一个 1.75 小时,第 6 位没过、第 7 位过了。1.75 到 3.5 这一带,0 和 1 打成了一片。
把点画到图上(横轴学习时长,纵轴通过与否):因为这是个 0/1 问题,所有点只能落在 和 两条线上。现在问题来了——给定一个新的点,比如 3 小时这个位置(注意:数据里这位实际是”未通过”),我该判为 1 还是判为 0?
硬切一条竖线当然不行——中间地带两边都有人。讲师的思路是:拟合一条在 0 和 1 之间平滑变化的曲线。比如在 3 的位置,这条曲线给出的结果大概是 0.6 左右——大于 0.5,判为通过。等等,数据里 3 小时明明是没通过的,判成”通过”不是错了吗?这里就是关键:学习时间越多,就越应该判为一——尽管这样做会让某些点产生损失、存在误差,但我们要找的是那个合适的函数,使整体误差最小。这条曲线属于谁?它就是逻辑斯特回归要构造的东西。(这个例子的潜台词讲师也点了:想成为好的算法工程师或科学家,和你直接投入的学习时间成正比。)
所以第一件事浮出水面:逻辑回归要构造的,是一个取值在 0~1 之间的连续函数,大于 0.5 判一、小于 0.5 判零。那怎么根据给定的数据训练出这样的函数?先得说清楚它长什么样。
Sigmoid 函数:构造出来的指数函数
答案是用指数函数构造。这个函数叫 Sigmoid 函数:
横轴是 ,纵轴是 (课件图里纵轴记作 ,同一个函数)。它是一条 S 形曲线: 趋向 时趋近 1,趋向 时趋近 0, 时恰好等于 0.5——正是我们要的中心值。 不同,得到的 0~1 之间的值就不同: 越大越接近 1, 越小越接近 0,过渡带平滑连续。
模型:线性组合装进指数函数
Logistic regression 做的事情其实特别简单:把 Sigmoid 里面的 构造成一个线性组合。
为什么是线性组合?回想第 8 章开头的记号:给定 ,它有 个分量。这些分量之间的关系,你确实不知道谁重谁轻,也不知道在某种分类下哪个权重更重要——那往往就可以先用一个线性组合去代替,把它们组合起来。但我们的目标输出只有 0 和 1,所以无论线性组合算出什么,最后都必须映射到 0 和 1 之间——构造这样一个指数函数,正好完成这个目的。
看清楚这个结构的两半:在 的里头,是一个线性组合、一个线性拟合;在外边看,是一个非线性的映射。它把所有的线性关系,通过 Sigmoid 函数压到了 0 和 1 之间。
这个函数的输出怎么解释?它落在 0 和 1 之间,所以可以认为:给定 的时候,它属于 的概率是多大——
如果 ,概率就是 1 减去上面那个值。所以逻辑回归拟合的,是这样一组条件概率。
数值实战:把 S 形曲线真正拟合到考试数据
口说无凭,把课件那张 20 人的完整表格喂给模型:用第 4 章的全量梯度下降(对数似然的梯度,纯标准库),拟合 ,再看它在中段重叠带的表现。
import math
# 课件完整数据: 20 名学生的学习时长与考试结果 (0=未通过, 1=通过)
hours = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 1.75, 2.0, 2.25, 2.5,
2.75, 3.0, 3.25, 3.5, 4.0, 4.25, 4.5, 4.75, 5.0, 5.5]
passed = [0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 1, 1, 1, 1, 1]
def sigmoid(z):
return 1.0 / (1.0 + math.exp(-z))
# 全量梯度下降拟合 P(通过 | 时长) = sigmoid(a*时长 + b)
a, b = 0.0, 0.0
for _ in range(200000):
ga, gb = 0.0, 0.0
for x, y in zip(hours, passed):
err = sigmoid(a * x + b) - y
ga += err * x
gb += err
a -= 0.5 * ga / len(hours)
b -= 0.5 * gb / len(hours)
print(f"学到的模型: P(通过|x) = sigmoid({a:.4f}*x + ({b:.4f}))")
print(f"P(通过) = 0.5 的分界点: x = {-b / a:.2f} 小时")
print()
print("重叠带逐点检查 (实际标签 vs 模型判断):")
for x, actual in [(1.75, 0), (1.75, 1), (2.0, 0), (2.25, 1), (2.5, 0),
(2.75, 1), (3.0, 0), (3.25, 1), (3.5, 0)]:
p = sigmoid(a * x + b)
pred = 1 if p > 0.5 else 0
tag = "" if pred == actual else " <- 损失"
print(f" {x:.2f} 小时: 实际={actual}, P(通过)={p:.3f}, 判={pred}{tag}")
correct = sum(1 for x, y in zip(hours, passed)
if (sigmoid(a * x + b) > 0.5) == (y == 1))
print(f"全部 20 个点: 判对 {correct} 个, 判错 {len(hours) - correct} 个")学到的模型: P(通过|x) = sigmoid(1.5046*x + (-4.0777))
P(通过) = 0.5 的分界点: x = 2.71 小时
重叠带逐点检查 (实际标签 vs 模型判断):
1.75 小时: 实际=0, P(通过)=0.191, 判=0
1.75 小时: 实际=1, P(通过)=0.191, 判=0 <- 损失
2.00 小时: 实际=0, P(通过)=0.256, 判=0
2.25 小时: 实际=1, P(通过)=0.334, 判=0 <- 损失
2.50 小时: 实际=0, P(通过)=0.422, 判=0
2.75 小时: 实际=1, P(通过)=0.515, 判=1
3.00 小时: 实际=0, P(通过)=0.607, 判=1 <- 损失
3.25 小时: 实际=1, P(通过)=0.693, 判=1
3.50 小时: 实际=0, P(通过)=0.766, 判=1 <- 损失
全部 20 个点: 判对 16 个, 判错 4 个三个观察。第一,讲师课堂上对着曲线读图说”3 的时候大概是 0.6 左右”——真实拟合结果 ,与读图严丝合缝。第二,模型把 0.5 分界线画在了 2.71 小时,重叠带里 9 个点判对 5 个、损失 4 个(包括那位实际没通过、但被判”通过”的 3 小时同学);全部 20 个点判对 16 个。第三——也是本节开头那个问题的答案——为什么明知有损失还要这么判?因为这条曲线让整体的误差函数最小:学习时间越多越应判为通过,个别点的损失是模型为了全局最优付出的代价。1.75 小时那对”一个过一个不过”的点,同一个输入两种结局,任何确定性规则都不可能全对——这正是从”硬分类”走向”概率输出”的理由。
几率(odds):真正被拟合的线性关系
现在回收开头卖的关子:逻辑回归”回归”在哪里?线性又线性在哪里?
我们真正拟合的部分,是两个概率的比值:
这个比值有个英文词,叫 odds,几率。逻辑回归研究的,是两类之间的相对关系:属于第一类大,属于第零类就小;反之亦然。如果 odds 等于 1,代表两类一样重要——相当于 0.5 对 0.5,正落在中心值上;如果它等于一个特别大的数,代表”上面”()压倒性地重要。
而逻辑回归拟合的线性关系是:几率的对数,是一个线性组合。把 代进去推导:
两边取对数:
对数几率与特征呈线性关系——这就是”对数几率回归”这个名字的全部含义,西瓜书的译名名副其实。反过来,把这个结果返回去解出 ,就能还原出 Sigmoid 公式——两者说的是同一件事的两面。选一个合适的 使分类结果最好,这就是逻辑回归的全部工作。
应用:电影评论的情感分类
逻辑回归有什么用?重不重要?讲师举了一个例子,还配套上传了一篇论文——他以前的学生写的,比较简单,正好跟 Logistic Regression 特别相关(本节末尾我们会看到它的真面目)。
先想象几句话:I love this movie,一句普通的夸赞;I hate this movie;I hate this terrible movie, terrible actor——特别讨厌这个男演员。像这样的电影评论,IMDb 数据库里存了很多,而且都已经加好了标签:这句是正面的、那句是负面的。正负两个分类——一个很明显的二分类问题,正好用逻辑回归做情感分类。
怎么建模?做一个特别简单的假设:每个词都附着一个情感权重,一句话的情感 = 每个词情感的线性组合。i 有个权重,love 有个权重,this 和 movie 也各有自己的权重;权重可正可负——正面词是正的、越正越积极,负面词(hate、terrible)是负的。线性组合过一遍 Sigmoid,输出小于 0.5 判负面、大于 0.5 判正面。
那像 terrible 这种词,模型怎么学出它是负的?你会发现:在很多句子里都有 terrible,而这些句子通常被标注为负面评论——那当然就学到了 terrible 与负面之间的关系,就像 beautiful 和 wonderful 总跟正面一起出现一样。训练的关键,就是学出每个词的这个情感权重。
先用一个玩具语料把”学权重”这件事走通(特征取词频——最简单的情况;论文实际用 TF-IDF,见下一节):
import math
# 微型情感语料: 1 = 正面评论, 0 = 负面评论 (特征 = 词频, 最简单情形)
docs = [
("beautiful movie", 1),
("wonderful", 1),
("terrible movie", 0),
("dull", 0),
]
vocab = ["beautiful", "wonderful", "terrible", "movie", "dull"]
X = [[text.split().count(w) for w in vocab] for text, _ in docs]
y = [label for _, label in docs]
def sigmoid(z):
return 1.0 / (1.0 + math.exp(-z))
def fmt(v):
v = 0.0 if abs(v) < 5e-4 else v # 把 -0.000 之类的负零归零
return f"{v:+.3f}"
# 全量梯度下降: 学习每个词的情感权重 w_j (含偏置 b)
w = [0.0] * len(vocab)
b = 0.0
for _ in range(3000):
gw = [0.0] * len(vocab)
gb = 0.0
for xi, yi in zip(X, y):
err = sigmoid(sum(wj * xj for wj, xj in zip(w, xi)) + b) - yi
for j in range(len(vocab)):
gw[j] += err * xi[j]
gb += err
for j in range(len(vocab)):
w[j] -= 0.5 * gw[j] / len(X)
b -= 0.5 * gb / len(X)
print("学习到的情感权重:")
for word, weight in sorted(zip(vocab, w), key=lambda t: -t[1]):
print(f" {word:10s}: {fmt(weight)}")
print(f" 偏置项 : {fmt(b)}")
print()
for sent in ["beautiful beautiful beautiful terrible",
"terrible terrible beautiful"]:
z = sum(w[vocab.index(t)] for t in sent.split())
p = sigmoid(z)
label = "正面" if p > 0.5 else "负面"
print(f"句子 '{sent}': z = {z:+.3f}, P(正面) = {p:.3f} -> {label}")学习到的情感权重:
beautiful : +5.915
wonderful : +5.915
movie : +0.000
terrible : -5.915
dull : -5.915
偏置项 : +0.000
句子 'beautiful beautiful beautiful terrible': z = +11.829, P(正面) = 1.000 -> 正面
句子 'terrible terrible beautiful': z = -5.915, P(正面) = 0.003 -> 负面结果几乎就是论文结论的微缩版:beautiful、wonderful 学出正权重,terrible、dull 学出负权重。最妙的是 movie 恰好是 0.000——它在一条正面评论和一条负面评论里各出现一次,两边的”用法”完全对称,梯度逐轮严格抵消,权重就停在零。真实语料不会这么工整,但机制相同:像 movie、film 这种词,在好的评论和坏的评论里出现的概率几乎一样,权重自然趋零——它们是不重要的词。(细节:这个玩具语料太容易被分开,训练轮数越多模型越自信、权重绝对值会一直涨——真实实现里会加正则化把权重收住,那是第 9 章岭回归与 LASSO 的正题。)
再看论文里真实学到的权重(IMDb 语料,论文图 1 的 Top 10):
| 极性 | Top 10 词 | 权重量级(讲师读图) |
|---|---|---|
| 正面 | Excellent、Perfect、Wonderful、Amazing、Great、Favourite、Best、Brilliant、Highly、Superb | Excellent 约 (最强),其余约 50 多 |
| 负面 | Worst、Awful、Waste、Boring、Poor、Terrible、Dull、Worse、Bad、Unfortunately | 大多在 到 (讲师读图:Worse 约 ) |
| 中性 | Scuttle、Minutiae、Virginity、Ungainly、Wallows、Tactic、Cory、Realisation、Angsty、Shifting | 约 |
对着图读:条越长越正面,负面那侧条越长越负面。讲师算过一笔账:句子里出现三次 beautiful,如果 beautiful 的情感强度是正 100,那就是 的加分;里面就算还有一个 terrible,减去 200—— 还是一个很正面的数,这句话仍然是正面的。而中性词的权重是 这个量级(注意坐标轴带着 )——跟 的情感词比,远远不到 0.01,几乎就是在零上。做训练时,我们还希望整个权重向量比较稀疏——大部分权重是 0——这样最关键的好词、坏词才能被干净地学出来。论文统计了全部词的权重分布:绝大多数词挤在 0 附近的小区间,只有一小撮伸到 、 之外——正是这种稀疏的样子。
从词频到 TF-IDF
论文描述的实际情况,比上面的最简版复杂两处。
第一处:特征不是单个词。 一个”词”不见得是一个词,可以是两个词的组合——one gram、bigram,论文把两者混合起来用(mixed-gram)。为什么?比如 worth watching 这个组合表达强烈的正面情感,但 watching 单独拿出来是中性的——拆开就把情绪稀释了;论文里 a must、not…at all 也是这种 valuable pattern,所以停用词不能一刀切全滤掉。
第二处: 不用词频,用 TF-IDF。 TF 就是 term frequency,词频:想搜一篇关于机器学习的文档,这篇文章出现 100 次”机器学习”、那篇只出现 2 次,当然 100 次的更重要。但只看词频并不完全——像”好""可以""了”这类助词或不重要的词,在这篇文章里出现得多,但它在所有的文章里出现得都多。所以关键度量是:这个词在本篇大量出现,且在其他语料库里出现得少。后者就是 IDF(inverse document frequency):看它在所有文档里出现的普遍程度,再取倒数——普遍程度越高,倒数越小。讲师的例子:Harry Potter 这个词只在 JK Rowling 的小说里大量出现,法律文档、宗教、科学文献里几乎没有——那这部小说就是与 Harry Potter 最直接相关的东西。TF-IDF 把两头合起来:本篇出现多 别处出现少——对给定词的”重要性”,是比单纯词频更合理的度量。论文里特征可以取词频、0/1 值或 TF-IDF,本节按讲师的最简路线用词频。
这篇论文值得认真读一眼:Learning Sentimental Weights of Mixed-gram Terms for Classification and Visualization(PRICAI 2016,讲师学生一作)——在 IMDb 的 25000 条训练影评(正负各半)上,用逻辑回归学出上面那张表里的词权重,还能画成情感词云。讲师还说过会把一份类似的代码释放给大家:不一定算 IMDb 的问题,但用这种简单的形式,就能做情感分类。当然它也许不够好——确实不够好,但有的情况下也够用了;要做得更好,可以把每个词从一个权重升级成一个权重向量、word embedding 词嵌入、情感嵌入——把问题构造得更复杂,但本质上,是类似的思想。
回望:线性模型的一次自然泛化
最后把逻辑回归放回线性模型的族谱里。我们本来就会求线性:给一堆数据,求一条线——这是线性回归,我们都熟。现在做的事情是:不求这条线本身,而是求这条线过了函数之后的输出值。所以它本质上还是一个线性关系,只是通过指数函数,把线性映射成了 0 和 1 之间的非线性样子——以前大家觉得逻辑回归很复杂,实际上它就是一个基本的线性关系,核心就是那一条:几率的对数,是一个线性函数。
线性关系的学法也不止一种。不代表只能学” 和 之间”的线性——我可以认为 和 之间是线性关系,这是一种新的线性;也可以像本节这样,认为 和 (对数几率)之间是线性关系。这一族统称广义线性模型(generalized linear model):把线性模型不断地推广、泛化,逻辑回归只是其中 取 0/1 的那个成员。
章末收线:线性模型一章的全景
到这里,第 8 章”线性模型”走完了,把今天的路线图摆出来:
- 最小二乘:从拟合的目标到正规方程,代数推导与几何解释(投影)双视角;
- 极大似然:linear model 不完全是 linear——它可以从极大似然这种概率的方式去理解,正态噪声假设下 MLE 就是 OLS;
- 逻辑回归:线性组合装进 Sigmoid,从回归走向分类,输出概率、按 0.5 判界;
- 应用:情感分类——词的情感权重、词频到 TF-IDF,一篇学生论文的真实结果。
如果对 Logistic Regression 还有问题,不用急——它是整个线性模型里最重要的部分之一,下一节还会再提到;多分类的 Softmax 也在下一节单独展开。
📝 动手练一练
- 几率手算:模型对三名学生输出 分别为 、、。分别计算三人的几率(odds),并解读每一档的含义;再验证公式 能把几率还原回概率。
👉 点击查看参考答案
odds :
- :odds ——两类一样重要,五五开,正落在 0.5 中心值上;
- :odds ——通过略占上风(1.5 : 1);
- :odds ——通过压倒性重要(9 : 1)。
还原验证: ✓。再往前一步: 时 odds 恒等于 (上一节推导的结论),所以 odds = 1 当且仅当 ,当且仅当 ——中心值、判别阈值、几率等于 1,说的是同一个地方。
- 情感分数手算:假设学到的权重为 wonderful 、terrible 、movie 。对句子 “wonderful wonderful terrible” 与 “terrible terrible wonderful” 分别手算情感分数 与 (,),判断正负;再验证第一句的几率恰为 。
👉 点击查看参考答案
- “wonderful wonderful terrible”:,——正面;
- “terrible terrible wonderful”:,——负面。
两个方向都体现”正面词的个数与负面词的个数在掰手腕”——权重乘上词频再求和,这正是情感分类的全部算术。验证:第一句 odds ✓——对数几率 ,正是本节的核心公式。把 movie 加进任何句子, 一分不加一分不减——中性词权重为零(论文里约 ),就是这个意思。
本章小结
- 名字:Logistic 音译”逻辑斯特回归”;西瓜书译”对数几率回归”更准确——它拟合的正是对数几率;名为回归、实为二分类(大于 0.5 判一,小于判零)。
- 形式:—— 里头是线性拟合,外头看是非线性映射;输出解释为 ,。
- 本质:——对数几率与特征线性;odds 等于 1 即五五开。它是广义线性模型家族中 取 0/1 的成员。
- 数值实证:20 人考试数据上,(讲师读图”约 0.6”);0.5 分界在 2.71 小时;重叠带 4 个损失、判对 16/20——个别点的损失换整体误差最小。
- 应用:情感分类 = 词情感权重的线性组合过 Sigmoid;正面词正、负面词负、中性词(movie/film)趋零;训练希望权重稀疏——大部分为 0,关键的好词坏词才能学出来。
- 特征升级:TF 是词频;IDF 是文档频率取倒数(本篇出现多 别处出现少);TF-IDF 比词频更合理;n-gram 从 one gram、bigram 到 mixed-gram(worth watching 不能拆)。
📋 行动清单
- 从 出发,不看讲义手推
- 运行本节两块代码:把考试数据里 3.5 小时那位改成”通过”,观察拟合曲线怎么挪;把情感 demo 的测试句子换成自己的组合
- 用 手算几率,给同学讲”odds 等于 1 是五五开、9 是 9:1”
- 找一句英文影评,按本节模型口算情感分:每个词按正负估个权重、乘上出现次数再求和
- 阅读课程附件论文(PRICAI 2016,Learning Sentimental Weights of Mixed-gram Terms for Classification and Visualization),重点看 mixed-gram 怎么把 worth watching 学成一个整体
- 预习下一节《逻辑回归(2)》:多分类的 Softmax 将单独展开
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。