常用矩阵导数
最开始接触神经网络的时候有线性感知机的前向传播和反向传播推导,里面用到了对向量求导的手段。后面了解到这是矩阵论里面一块很大的内容,叫矩阵的导数,也一直没学明白。但是后来学最优化和模式识别之后,似乎常用的矩阵导数并不是很多,这边来盘点一下常用的矩阵导数。
为什么要做矩阵导数?
要费劲对矩阵求导数肯定有它的原因,在机器学习里一般是为了优化某些参数。现在训练神经网络是使用了一阶导数的随机梯度下降法。这里提到一个概念叫梯度,一个点的梯度指向该函数上升最快的方向,用\(\nabla f(\mathbf{x})\)表示。 \[
\nabla f(\mathbf{x}) = \frac{\partial f}{\partial \mathbf{x}} =
\begin{bmatrix}\frac{\partial f}{\partial \mathbf{x_1}}\\\frac{\partial
f}{\partial \mathbf{x_2}}\\ \vdots \\ \frac{\partial f}{\partial
\mathbf{x_d}} \end{bmatrix}
\] 如果\(\ma ...
两种降维算法(PCA和FLDA)的推导
5月份马上结束了。额,是真的马上结束了,截止我动手写这篇博客的时候,已经是5月最后一天的8点钟了。然后因为5月份在忙一些别的事,一直没有时间停下来总结一下学了什么。想着5月份最后一天了如果再不写点那5月份就真的过去了。之前写了瑞利商的优化问题,那这里就完成一下应用了瑞利商优化的两个降维算法(PCA和FLDA)的推导吧,算是给5月份划个句号。
PCA
PCA的全名叫"主成分分析"(Principal Component
Analysis),这个算法是非常著名的无监督降维方法。无监督降维顾名思义就是它降维的时候不需要给定数据的标签。它的核心是寻找一个最能代表原始数据低维表示的投影方向。
它可以建模为一个线性回归的问题,即找到一条直线能最好地拟合所有的样本点,这样所有的数据点都在一条直线上,就达到了“降维”的目的,而且因为这条直线是所有样本点的最佳拟合,因此样本在该直线上的投影是最能代表原样本的低维表示。要定义最佳拟合,可以借助回归问题的解法,每个数据点到该直线的距离的和最小,即最小平方误差。
定义直线: \[
\mathbf{x} = \mathbf{m} + a \mathbf{e} \ ...
瑞利商优化
上模式分类课推导Fisher的LDA算法时,看到书上有要优化这样一个准则函数:
\[
\max J(w) = \frac{w^T S_B w}{w^T S_W w}
\]
书上说这个表达式在数学物理里经常用,叫广义瑞利商,然而我完全不了解是什么情况,所以上网去查学习一下。
瑞利商的基本形式
瑞利商的基本形式表示为: \[
R(M,x) = \frac{x^TMx}{x^Tx}
\] \(M\)是对称矩阵。
要求最大化\(R(M,x)\)的向量\(x\),可以观察到\(x\)的模与\(R(M,x)\)的大小无关,因此可以增加约束:
\[
x^T x=1
\] 这样可以应用拉格朗日乘数法: \[
L(x, \lambda) = x^TMx - \lambda (x^Tx - 1)
\] 其中\(\lambda\)是拉格朗日乘子,驻点在: \[
\frac{\partial L(x, \lambda)}{\partial x} = 0
\] 求导后带入可得: \[
2 x^T M -2\lambda x^T = 0
\] 化简整理后可得: \[
Mx=\lambda x
\] 此时: \[
...
浅谈分类问题损失的形式化表示
最近在学《模式分类》这门课,刚好上到第2章
贝叶斯决策这块。在这个文章里面不是要写贝叶斯分类器是怎么工作的,而是如标题所言,主要写一下一般的分类问题中,如何形式化地表示损失。
符号表示
以连续特征下的分类问题为例。
\(\omega_i\)表示类别为第\(i\)类。
样本的特征向量表示为\(\textbf{x}\),其中\(\textbf{x}\)处于d维欧氏空间\(\textbf{R}^d\),称为特征空间。
令{\(w_1\), \(w_2\), \(\cdots\), \(w_c\)}表示有限的c个类别集。
令{\(\alpha_1\), \(\alpha_2\), \(\cdots\), \(\alpha_a\)}表示有限种可能的行为集,注意此处行为集的可能不一定是c种,在某些分类问题中可以选择拒绝回答的动作来降低风险。
\(\lambda(a_i,
w_j)\)描述的是状态类别为\(\omega_j\)时采取行动\(\alpha_i\)的损失。
形式化样本分类损失
如果给定某个特定的样本\(\textbf{x}\),每个动作的预期损失可表达为:
\[
R(\alpha_i|\ ...
浅谈批量大小与学习率之间的关系
在训练的时候增大了批次大小,然后学习率不变,期待能获得相似的训练结果并且缩短训练时间的。但是事实却是训练时间确实有缩短,但损失函数的下降却不如调整之前那么好了。这意味着更改每次传入的批次大小,即使学习率没变(随机种子这些也都没变),但由于间接的影响,模型在同一个数据集上的“学习能力”却发生了变化。
增大Batch
Size之后发生了什么?
那在其他超参数不变的时候,增大Batch
Size会发生什么呢?一个显著的变化就是模型每次会在一个batch里面加载更多的样本,然后前向传播之后再反向传播计算平均损失。也就意味着增大Batch
Size,会使得损失方差更小,因为它每个批次对更多的样本进行了平均。
从一个极端的角度看,设置batch_size=1时,如果有一个错误标注的样本被混入数据集中了,那对于已经学到一些分类特征的模型来说,恰好加载到它的那一个批次损失将会非常大;在加载下一个正常样本时,损失又会变小到正常水平。反映到损失曲线的变化上就是损失函数突然出现一个锯齿形状的变化。由于batch_size是1,这个非常大的损失是直接作用于模型权重上了,会使得模型在这个批次上处于一个“被误导” ...
浅谈Linux下的脚本运行与压缩文件解压
标题咋一看有点奇怪,脚本运行和压缩文件解压有啥关系,其实确实没啥关系,单纯只是因为笔者最近接触到这两方面的一些东西了,准备写一写来记录一下。但是又懒得开两个文章了,所以干脆把没啥联系的两个东西放一个地方写了。
Linux脚本运行
Linux下说的脚本,一般是指以.sh结尾的Shell脚本。我没有接触过啥Shell编程,据说Shell这能写上千行做业务的,应该表达能力很强。我的个人理解就是一个高级命令行,类似于Python解释器即时解释模式和写.py文件之后再解释类似。
那就按和Python的对应关系,来简单粗略地看一下Shell的语法。
Shell的语法
变量赋值
有时候需要储存一些信息,那就首先得用到变量。和Python类似,Shell没有所谓的类型,只需要直接赋值即可。不过要注意变量名和等号之间不能有空格!
1image_path="/root/data/image_path"
但使用的时候需要额外用$符号标记一下:
1echo $image_path
拼接字符串
拼接字符串也是非常重要的一个技能,毕竟有时候还是希望输出更可读一点的:
12cd $image_p ...
浅谈分类任务的指标
在做分类任务时一般会想到使用正确率Accuracy指标,这是相当符合直觉的一个指标。就类似于我们人类做选择题一样,不管是ABCD四选一还是ABC三选一,总之数一下题目的数量,再数一下答对的题目的数量,最后后者比前者算出正确率,然后按正确率越高越好的原则做出判断即可。但在做分类任务时,由于数据集呈现出来不同的特点,因此单纯考察正确率就显得不太公平。比如一张卷子提前知道了70%的题是将A选项作为正确答案的,那即使什么都不会的人参考,只要全选A也能得70分,这样正确率的评估效果就大打折扣了。
为了寻找在不同数据集下能相对公平评判模型效果,像精确率Precision、召回率Recall、F1分数、AUCROC曲线下面积这的指标也常常被用于分类任务。本文中将做一下简单的梳理。
基础分类指标
分类任务可以分为二分类和多分类,对于多分类任务,对每个类别也可以看作为”是该类“与”不是该类“的二分类任务。因此在下面讨论基础分类指标时,均以二分类作为基准来讨论。记号如下:
True Positive (TP): 把正样本成功预测为正。
True Negative (TN):把负样本成功预测为负。
Fal ...
浅谈read_image出错的解决办法
问题描述
在进行和图像有关的深度学习处理时,常常会调用到torchvision.io中的一个函数read_image。这个函数往往是图像送入模型的临门一脚,只要经过这个函数之后,图片按照路径被读入内存,经过transforms之后输入模型。
然而,如果没有做好预处理,read_image常常会报一些意外的错误之后退出,然后整个训练也随之中断了。本文想浅谈一下笔者个人遇到的问题并给出一些解决方案。
解决方案
仅支持RGB的色彩模式
read_image只支持RGB的色彩模式,这很好理解也很合理。因为如果我们图片不只有RGB的话,就没办法保证读入的数据是有R,
G,
B三个通道的,它可能有4个通道(CMYK色彩模式的图片)或者只有1个通道(灰度图)。
灰度图很好理解,其实就是黑白照片那样。那CMYK呢,参考链接:
印刷四分色模式(CMYK)是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。四种标准颜色是:
C:Cyan = 青色或“水蓝”
M:Magenta = 洋红色或“紫色”
Y:Yellow = 黄色
K:Key ...
论文分享-基于提示的多模态仇恨迷因分类
Overview
Prompting for Multimodal Hateful Meme
Classification(基于提示的多模态仇恨迷因分类)是多模态迷因分类方向的一篇论文,该论文发表于2022年的EMNLP会议上。论文地址
论文扉页
Introduction
进行多模态仇恨迷因检测的意义?
互联网迷因(Internet
memes)已经发展成为社交媒体上最受欢迎的交流形式之一。迷因是以附带文本的图像形式呈现的,通常是为了搞笑或者讽刺。然而,恶意网络用户在幽默的幌子下创作和分享有仇恨性的迷因,这些迷因会基于种族、宗教等特定特征攻击和仇视某些群体。
这些仇恨迷因也继承了互联网迷因病毒式传播的特性,仇恨迷因比纯文本的网络仇恨言论对社会威胁更大,用户可以在更多的对话或者语境中转发这些仇恨迷因。因此,如何检测仇恨迷因并打击仇恨迷因的传播是具有现实意义的问题。
多模态仇恨迷因检测面临哪些挑战?
仇恨迷因检测时一项具有挑战性的多模态分类任务。因为性能优秀的解决方案需要跨视觉和文本模态来理解和推理迷因想要表达的意思,在分类时,可能还需要背景知识来辅助对迷因含义的推理。
需要跨文本 ...
Git使用
Git使用
git是众多版本控制的软件之一,适用于中小项目。
图形化界面
使用VSCode,左边侧栏有一个图形化的Git界面,非常的好用
使用流程
1、 登陆Github
2、创建代码仓库
3、commit -> 提交,生成检查点
4、提交前必须先stage,commit记得提交时打好备注
5、push将改变推送到远程仓库
6、pull将远程仓库同步到本地仓库
7、merge用于合并两仓库
8、自动合并可能失败
常见命令
123456789101112131415161718192021222324252627282930313233# 配置基本信息git config --global user.name <你的用户名>git config --global user.email <你的邮箱地址># 创建一个新仓库git init# 从远程服务器克隆一个仓库git clone <远程仓库 url># 显示当前工作目录下的提交文件状态git status# 将文件添加到要提交的文件中git add <文件路径># 添加处.gitig ...