AutoEncoder
AutoEncoder自编码 AutoEncoder 是一种无监督学习的算法,他利用反向传播算法,让目标值等于输入值。
比如对于一个神经网络,输入一张图片,通过一个 Encoder 神经网络,输出一个比较 “浓缩的”feature map。之后将这个 feature map 通过一个 Decoder 网络,结果又将这张图片恢复。
如果说我们的数据集特别大,对于直接训练而言性能肯定较低。但如果我们对数据特征进行提取,缩减输入信息量,学习起来就相对轻松。
简单模型下面是一个AutoEncoder的三层模型,其中 $W^* = W^T$
2010年,Vincent 在论文中表明,只用单组W就可以,所以W*没有必要去训练。
http://jmlr.org/papers/volume11/vincent10a/vincent10a.pdf
如果实数作为输入,损失函数为 $L(f(x)) = {1\over2}\sum_{k}(\hat x_k - x_k)^2$
PCA 和 AutoEncoderPCA又叫主成分分析法,是将n维特征映射到k维上,本质上是个线性变 ...
Linux CMake工程目录结构
Linux CMake工程目录结构主文件目录1234./lib/./src/./build./CMakeLists.txt
./CMakeLists.txt12345678CMAKE_MINIMUM_REQUIRED( VERSION 3.10 )PROJECT(MAIN)ADD_SUBDIRECTORY(./lib )ADD_SUBDIRECTORY(./src)
./lib/CMakeLists.txt12345AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)ADD_LIBRARY(LIB STATIC ${DIR_LIB_SRCS})
./src/CMakeLists.txt12345678910INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib) SET(EXECUTABLE_OUTPUT_P ...
C++主存层面数据交换
C++ 互换指针指向内存结果1. 互换指针指向内存结果将命令参数前两个值在主存中互换并输出。
1234567891011121314#include <iostream>#include "mySwap.hpp"int main(int argc, char** argv){ std::cout<<"Origin info is: "<<std::endl; std::cout<<"a: "<<argv[1]<<" \tb: "<<argv[2]<<std::endl; mySwap(argv[1],argv[2]); std::cout<<"Has been swaped info is: "<<std::endl; std::cout<<"a: "< ...
不变风险最小化
Invariant Risk Minimization不变风险最小化论文链接https://arxiv.org/abs/1907.02893
基本介绍现有机器学习是通过不断减小训练误差,来实现复杂的预测模型,但计算机是不加选择的提取训练数据的相关性, correlation-versus-causation【相关性和因果性】有时并不一样,此论文是在研究利用因果关系拓展不变相关性的问题。
文中例子文中提到一个例子,是对奶牛和骆驼分类。但由于数据集中,大多数奶牛照片是在牧场拍摄的,背景色为绿色,骆驼是在沙漠中。因此神经网络在训练时,不断降低loss值,最终其实是将绿色背景归类为奶牛,米色背景归为骆驼。所以训练出来的结果是不具有泛化性的。
IRM不变风险最小化 (IRM) 是从多次训练中估计非线性、不变、因果预测因子来实现分布外泛化。
重点:为训练引入约束,将约束表述为惩罚。IRM的目标是构建泛化分布外的预测器。
视觉域泛化
Domain Generalization in Vision: A Survey视觉域泛化论文地址https://arxiv.org/abs/2103.02503
简介大多数统计学习算法强烈依赖过于简化的假设,即源数据和目标数据是独立的同分布,而忽略了实践中常见的分布外(OOD)场景。为了克服域转移问题以及目标数据的缺失,引入了域泛化(DG)问题,DG 的目标是使用来自单个或多个相关但不同的源域的数据来学习模型,以便该模型可以很好地泛化到任何 OOD 目标域。
研究 DG 的最初动机是利用多源数据来学习对不同边际分布具有不变性的表示,使用多个域允许模型发现跨源域的稳定模式,从而更好地泛化到看不见的域。然而,单源 DG 方法不需要用于学习的领域标签,因此它们也适用于多源场景。
给定标记的源域 S,DG 的目标是使用来自 S 的数据学习模型 f,以便该模型可以很好地泛化到一个看不见的域 T。
Sentiment Analysis For RNN
Sentiment Analysis For RNN循环神经网络进行情感分析引言:对于情感分析,如果简化来看可以分为正向情绪和负向情绪,我们可以将情感分析视为文本分类任务,因此我们可以将预训练的词向量应用于情感分析。我们可以用预训练的GloVe模型表示每个标记,并反馈到RNN中。
RNN表征文本在文本分类任务中,要将可变长度的文本序列转为固定长度。可以通过nn.Embedding()函数获得单独的预训练GloVe,再去通过双向LSTM,最后在去通过一个全连接层做一个二分类,即可实现RNN表征文本。
123self.embedding = nn.Embedding(vocab_size, embed_size)self.encoder = nn.LSTM(embed_size, num_hiddens, num_layers=num_layers,bidirectional=True)self.decoder = nn.Linear(4 * num_hiddens, 2)
1234embeddings = self.embedding(inputs.T)outputs, _ = s ...
VGG16实现分类任务
VGG16实现分类任务VGG是2014年由牛津大学著名研究组VGG(Visual Geometry Group)提出,斩获当年ImageNet竞赛中定位任务第一名和分类任务第二名。
原理图
原理简述例如有张224x224的RGB图片,我们让他通过两个卷积核为3的卷积层,再通过最大池化层(核尺寸为2,步距为2)。至于卷积层的输入输出维度,参考下图,我们一般常用VGG16模型,最终用多个FC实现分类,也可将FC换成卷积核为1的卷积层。
数据集同样选用本人常用的海贼王数据集来测试,可以根据个人需求修改。
下面提供一个简单数据集。
Kaggle的鸟儿分类数据集,共315个分类
https://www.kaggle.com/gpiosenka/100-bird-species
可以用kaggle命令选择下载
1kaggle datasets download -d gpiosenka/100-bird-species
数据预处理讲图片预resize为224x224的图片,并进行随机翻转,可参考图像增广
https://www.quarkhackers.space/2021/10/ ...
近似训练
近似训练 在对跳元模型和连续词袋模型的梯度计算过程中需要求和,所以对于词典而言,求和的梯度计算成本十分巨大。所以我们可以采用负采样和分层softmax
负采样 负采样修改了原目标函数,放弃softmax转而使用sigmoid来实现。
sigmoid的函数定义如下:
我们从最大化文本序列中所有这些事件的联合概率开始训练词嵌入,如果只算正向部分,那对于给定长度为TT的文本序列,以w^(t)表示时间步t的词,并使上下文窗口为m,最大化联合概率为:
而负采样添加从预定义分布中采样的负样本。
用Wk表示噪声词,则Wk与中心词的窗口内上下文词的条件概率为:
用v和u分别表示中心词和上下文词的两个向量,用it和hk分别表示窗口内词与噪声词在时间步t处的索引,则件概率的对数损失为:
总结:每个训练步的梯度计算成本与词表大小无关,而是线性依赖于采样K。当将超参数K设置为较小的值时,在负采样的每个训练步处的梯度的计算成本较小。
分层SoftMax ...
Perceptron
Perceptron原理简单的感知机可以看作一个二分类,假定我们的公式为
f(x) = sign(w *x + b)
我们把 -b 做为一个标准,w* x 的结果与 -b 这个标准比较,
w*x > -b, f(x) = +1
w *x < -b, f(x) = -1
不难看出w是超平面的法向量,超平面上的向量与w的数量积为0。因此这个超平面就可以很好的区分我们的数据集。
而感知机就是来寻找w和b
优化方法优化方法我们现有的方法比较多,诸如GD、SGD、Minibatch、Adam
当然我们的损失函数也包含多种,常见的有MSE, CrossEntropy.
这边简单展示一下MSE以及GD原理。
SoftMax如果我们输出为多分类,那就成为一个SoftMax回归。
SoftMax回归和线性回归一样将输入特征与权重做线性叠加。与线性回归的一个主要不同在于,SoftMax回归的输出值个数等于标签里的类别数。
MLP而我们给SoftMax回归增加隐藏层,就是我们所说的多层感知机,而
全连接层只是对数据做仿射变换,我们的方 ...
图像增广
图像增广 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模,提高泛化能力。
随机翻转 例如,现在有一张小狗的照片,我们可以借助transforms的RandomHorizontalFlip()来翻转。
翻转之后的结果如下图。
随机裁剪 我们可以通过随机裁剪降低模型对目标的敏感性,可用RandomResizedCrop()来实现。
改变颜色 我们也可以通过调整图片亮度、对比度、饱和度、色调来扩充数据集。
结合 我们结合前面的多种方法可以扩充我们的数据集,以实现训练精度提升的效果。