• [其他] 用Transformer实现OCR字符识别(2)
    下面简单介绍数据集的快速使用:本地下载安装 tensorbaypip3 install tensorbay打开本文数据集链接:https://gas.graviti.cn/dataset/datawhale/ICDAR2015将数据集fork到自己账户下点击网页上方开发者工具 --> AccessKey --> 新建一个AccessKey --> 复制这个Key from tensorbay import GAS from tensorbay.dataset import Dataset # GAS凭证 KEY = 'Accesskey-***************80a'  # 添加自己的AccessKey gas = GAS(KEY) # 获取数据集 dataset = Dataset("ICDAR2015", gas) # dataset.enable_cache('./data')  # 开启本语句,选择将数据建立本地缓存 # 训练集和验证集 train_segment = dataset["train"]valid_segment = dataset['valid'] # 数据及标签 for data in train_segment:     # 图像数据     img = data.open()     # 图像标签     label = data.label.classification.category     break通过以上代码获取的图像及标签形式如下:imglabel['C', 'A', 'U', 'T', 'I', 'O', 'N']通过以上简单代码便可以快速获取图像数据及标签,但程序每次运行都会自动去平台下载数据,因此耗时较长,建议开启本地缓存,一次下载多次使用,当不再使用数据时便可以将数据删除。二、数据分析与关系构建开始实验前,我们先对数据进行简单分析,只有对数据的特性足够了解,才能够更好的搭建出baseline,在训练中少走弯路。运行下面代码,即可一键完成对于数据集的简单分析:python analysis_recognition_dataset.py具体地,这个脚本所做的工作包括:对数据进行标签字符统计(有哪些字符、每个字符出现次数多少)、最长标签长度统计,图像尺寸分析等,并且构建字符标签的映射关系文件 lbl2id_map.txt。下面我们来一点点看代码:注:本文代码开源地址:https://github.com/datawhalechina/dive-into-cv-pytorch/tree/master/code/chapter06_transformer/6.2_recognition_by_transformer(online_dataset)首先完成准备工作,导入需要的库,并设置好相关目录或文件的路径import os from PIL import Image import tqdm from tensorbay import GAS from tensorbay.dataset import Dataset # GAS凭证 KEY = 'Accesskey-************************480a'  # 添加自己的AccessKey gas = GAS(KEY) # 数据集获取并本地缓存 dataset = Dataset("ICDAR2015", gas) dataset.enable_cache('./data')  # 数据缓存地址 # 获取训练集和验证集 train_segment = dataset["train"] valid_segment = dataset['valid'] # 中间文件存储路径,存储标签字符与其id的映射关系 base_data_dir = './' lbl2id_map_path = os.path.join(base_data_dir, 'lbl2id_map.txt')2.1 标签最长字符个数统计首先统计数据集最长label中包含的字符数量,此处要将训练集和验证集中的最长标签都进行统计,进而得到最长标签所含字符。def statistics_max_len_label(segment):     """     统计标签中最长的label所包含的字符数     """     max_len = -1     for data in segment:         lbl_str = data.label.classification.category  # 获取标签         lbl_len = len(lbl_str)         max_len = max_len if max_len > lbl_len else lbl_len     return max_len train_max_label_len = statistics_max_len_label(train_segment)  # 训练集最长label valid_max_label_len = statistics_max_len_label(valid_segment)  # 验证集最长label max_label_len = max(train_max_label_len, valid_max_label_len)  # 全数据集最长label print(f"数据集中包含字符最多的label长度为{max_label_len}")数据集中最长label含有21个字符,这将为后面transformer模型搭建时的时间步长度的设置提供参考。2.2 标签所含字符统计下面代码查看数据集中出现过的所有字符:def statistics_label_cnt(segment, lbl_cnt_map):     """     统计标签文件中label都包含哪些字符以及各自出现的次数     lbl_cnt_map : 记录标签中字符出现次数的字典     """     for data in segment:         lbl_str = data.label.classification.category  # 获取标签         for lbl in lbl_str:                 if lbl not in lbl_cnt_map.keys():                     lbl_cnt_map[lbl] = 1                 else:                     lbl_cnt_map[lbl] += 1 lbl_cnt_map = dict()  # 用于存储字符出现次数的字典 statistics_label_cnt(train_segment, lbl_cnt_map)  # 训练集中字符出现次数统计 print("训练集中label中出现的字符:") print(lbl_cnt_map) statistics_label_cnt(valid_segment, lbl_cnt_map)  # 训练集和验证集中字符出现次数统计 print("训练集+验证集label中出现的字符:") print(lbl_cnt_map)输出结果为:训练集中label中出现的字符: {'C': 593, 'A': 1189, 'U': 319, 'T': 896, 'I': 861, 'O': 965, 'N': 785, 'D': 383, 'W': 179, 'M': 367, 'E': 1423, 'X': 110, '$': 46, '2': 121, '4': 44, 'L': 745, 'F': 259, 'P': 389, 'R': 836, 'S': 1164, 'a': 843, 'v': 123, 'e': 1057, 'G': 345, "'": 51, 'r': 655, 'k': 96, 's': 557, 'i': 651, 'c': 318, 'V': 158, 'H': 391, '3': 50, '.': 95, '"': 8, '-': 68, ',': 19, 'Y': 229, 't': 563, 'y': 161, 'B': 332, 'u': 293, 'x': 27, 'n': 605, 'g': 171, 'o': 659, 'l': 408, 'd': 258, 'b': 88, 'p': 197, 'K': 163, 'J': 72, '5': 80, '0': 203, '1': 186, 'h': 299, '!': 51, ':': 19, 'f': 133, 'm': 202, '9': 66, '7': 45, 'j': 15, 'z': 12, '´': 3, 'Q': 19, 'Z': 29, '&': 9, ' ': 50, '8': 47, '/': 24, '#': 16, 'w': 97, '?': 5, '6': 40, '[': 2, ']': 2, 'É': 1, 'q': 3, ';': 3, '@': 4, '%': 28, '=': 1, '(': 6, ')': 5, '+': 1} 训练集+验证集label中出现的字符: {'C': 893, 'A': 1827, 'U': 467, 'T': 1315, 'I': 1241, 'O': 1440, 'N': 1158, 'D': 548, 'W': 288, 'M': 536, 'E': 2215, 'X': 181, '$': 57, '2': 141, '4': 53, 'L': 1120, 'F': 402, 'P': 582, 'R': 1262, 'S': 1752, 'a': 1200, 'v': 169, 'e': 1536, 'G': 521, "'": 70, 'r': 935, 'k': 137, 's': 793, 'i': 924, 'c': 442, 'V': 224, 'H': 593, '3': 69, '.': 132, '"': 8, '-': 87, ',': 25, 'Y': 341, 't': 829, 'y': 231, 'B': 469, 'u': 415, 'x': 38, 'n': 880, 'g': 260, 'o': 955, 'l': 555, 'd': 368, 'b': 129, 'p': 317, 'K': 253, 'J': 100, '5': 105, '0': 258, '1': 231, 'h': 417, '!': 65, ':': 24, 'f': 203, 'm': 278, '9': 76, '7': 62, 'j': 19, 'z': 14, '´': 3, 'Q': 28, 'Z': 36, '&': 15, ' ': 82, '8': 58, '/': 29, '#': 24, 'w': 136, '?': 7, '6': 46, '[': 2, ']': 2, 'É': 2, 'q': 3, ';': 3, '@': 9, '%': 42, '=': 1, '(': 7, ')': 5, '+': 2, 'é': 1}上方代码中,lbl_cnt_map 为字符出现次数的统计字典,后面还会用于建立字符及其id映射关系。从数据集统计结果来看,测试集含有训练集没有出现过的字符,例如测试集中包含1个'é'未曾在训练集出现。这种情况数量不多,应该问题不大,所以此处未对数据集进行额外处理(但是有意识的进行这种训练集和测试集是否存在diff的检查是必要的)。
  • [其他] 用Transformer实现OCR字符识别(1)
    文章来源于Datawhale ,作者安晟、袁明坤在CV领域中,transformer除了分类还能做什么?本文将采用一个单词识别任务数据集,讲解如何使用transformer实现一个简单的OCR文字识别任务,并从中体会transformer是如何应用到除分类以外更复杂的CV任务中的。全文分为四部分:一、数据集简介与获取二、数据分析与关系构建三、如何将transformer引入OCR四、训练框架代码讲解注:本文围绕如何设计模型和训练架构来解决OCR任务,文章含完整实践,代码很长建议收藏。不熟悉transformer的小伙伴可以点击这里回顾。整个文字识别任务中,主要包括以下几个文件:- analysis_recognition_dataset.py (数据集分析脚本)- ocr_by_transformer.py (OCR任务训练脚本)- transformer.py (transformer模型文件)- train_utils.py (训练相关辅助函数,loss、optimizer等)其中 ocr_by_transformer.py 为主要的训练脚本,其依托 train_utils.py 和 transformer.py 两个文件构建 transformer 来完成字符识别模型的训练一、数据集简介与获取本文使用的数据集基于ICDAR2015 Incidental Scene Text 中的 Task 4.3: Word Recognition,这是一个著名的自然场景下文本识别数据集,本次用来进行单词识别任务,我们去掉了其中一些图片,来简化这个实验的难度,因此本文的数据集与原始数据集略有差别。为了能够更好的进行数据共享和版本管控,我们选择在线调用数据集,将简化后的数据集存放在专门的数据共享平台,数据开源地址:         https://gas.graviti.cn/dataset/datawhale/ICDAR2015 ,有相关问题可以直接在数据集讨论区交流。该数据集包含了众多自然场景图像中出现的文字区域,数据中训练集含有4326张图像,测试集含有1992张图像,他们都是从原始大图中依据文字区域的bounding box裁剪出来的,图像中的文字基本处于图片中心位置。数据集中图像类似如下样式:数据本身以图像展示,对应的标签存储在CLASSIFICATION中,后文代码中标签获取,将直接得到一个包含所有字符的列表,这也是为了方便标签易用性进行的存储选择。
  • [其他] 如何使用Batch Normalization?
    我们知道BN在每一层计算的  与  都是基于当前batch中的训练数据, 但是这就带来了一个问 题: 我们在预测阶段, 有可能只需要预测一个样本或很少的样本, 没有像训练样本中那么多的数 据, 此时  与  的计算一定是有偏估计, 这个时候我们该如何进行计算呢?利用BN训练好模型后, 我们保留了每组mini-batch训练数据在网络中每一层的  与  。此时我们使用整个样本的统计量来对Test数据进行归一化,具体来说使用均值与方差的无偏估计:得到每个特征的均值与方差的无偏估计后, 我们对test数据采用同样的normalization方法:另外,除了采用整体样本的无偏估计外。吴恩达在Coursera上的Deep Learning课程指出可以对train阶段每个batch计算的mean/variance采用指数加权平均来得到test阶段mean/variance的估计。4 Batch Normalization的优势Batch Normalization在实际工程中被证明了能够缓解神经网络难以训练的问题,BN具有的有事可以总结为以下三点:(1)BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的变化,从而实现了网络中层与层之间的解耦,允许每一层进行独立学习,有利于提高整个神经网络的学习速度。(2)BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定在神经网络中,我们经常会谨慎地采用一些权重初始化方法(例如Xavier)或者合适的学习率来保证网络稳定训练。当学习率设置太高时, 会使得参数更新步伐过大, 容易出现震荡和不收敛。但是使用BN的网络将 不会受到参数数值大小的影响。例如, 我们对参数  进行缩放得到  。对于缩放前的值  , 我们设其均值为 , 方差为 ; 对于缩放值 , 设其均值为 , 方差为 , 则我们有:注:公式中的  是当前层的输入,也是前一层的输出;不是下标啊旁友们!我们可以看到, 经过BN操作以后, 权重的缩放值会被“抺去”, 因此保证了输入数据分布稳定在一定范围内。另外, 权重的缩放并不会影响到对  的梯度计算; 并且当权重越大时, 即  越大,  越小,意味着权重  的梯度反而越小,这样BN就保证了梯度不会依赖于参数的scale, 使得参数的更新处在更加稳定的状态。因此,在使用Batch Normalization之后,抑制了参数微小变化随着网络层数加深被放大的问题,使得网络对参数大小的适应能力更强,此时我们可以设置较大的学习率而不用过于担心模型divergence的风险。(3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题在不使用BN层的时候, 由于网络的深度与复杂性, 很容易使得底层网络变化累积到上层网络中, 导致模型的训练很容易进入到激活函数的梯度饱和区; 通过normalize操作可以让激活函数的输入数据落在梯度非饱和区, 缓解梯度消失的问题; 另外通过自适应学习  与  又让数据保留更多的原始信息。(4)BN具有一定的正则化效果在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。另外,原作者通过也证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。(二)实战板块经过了上面了理论学习,我们对BN有了理论上的认知。“Talk is cheap, show me the code”。接下来我们就通过实际的代码来对比加入BN前后的模型效果。实战部分使用MNIST数据集作为数据基础,并使用TensorFlow中的Batch Normalization结构来进行BN的实现。数据准备:MNIST手写数据集代码地址:我的GitHub (https://github.com/NELSONZHAO/zhihu/tree/master/batch_normalization_discussion)注:TensorFlow版本为1.6.0实战板块主要分为两部分:网络构建与辅助函数BN测试1 网络构建与辅助函数首先我们先定义一下神经网络的类,这个类里面主要包括了以下方法:build_network:前向计算fully_connected:全连接计算train:训练模型test:测试模型1.1 build_network我们首先通过构造函数,把权重、激活函数以及是否使用BN这些变量传入,并生成一个training_accuracies来记录训练过程中的模型准确率变化。这里的initial_weights是一个list,list中每一个元素是一个矩阵(二维tuple),存储了每一层的权重矩阵。build_network实现了网络的构建,并调用了fully_connected函数(下面会提)进行计算。要注意的是,由于MNIST是多分类,在这里我们不需要对最后一层进行激活,保留计算的logits就好。
  • [其他] Batch Normalization原理与实战(2)
    2.2.1 参数定义我们依旧以下图这个神经网络为例。我们定义网络总共有 LL 层(不包含输入层)并定义如下符号:参数相关: : 网络中的层标号 : 网络中的最后一层或总层数 : 第  层的维度, 即神经元结点数 : 第  层的权重矩阵, 第  层的偏置向量, : 第  层的线性计算结果,  input : 第  层的激活函数 : 第  层的非线性激活结果,样本相关: : 训练样本的数量 : 训练样本的特征数 : 训练样本集,  (注意这里  的一列是一个 样本) : batch size, 即每个batch中样本的数量 : 第  个mini-batch的训练数据, , 其中2.2.2 算法步骤介绍算法思路沿袭前面BN提出的思路来讲。第一点, 对每个特征进行独立的normalization。我们考虑一个batch的训练, 传入  个训练样本, 并关注网络中的某一层, 忽略上标  。我们关注当前层的第  个维度, 也就是第  个神经元结点, 则有  。我们当前维度进行规范化:下面我们再来结合个具体的例子来进行计算。下图我们只关注第  层的计算结果, 左边的矩阵是  线性计算结果, 还末进行激活函数的非线性变换。此时每一列是一个样本, 图中可以看到共有8列, 代表当前训练样本的batch中zo共有8个样本, 每一行代表当前  层神经元的一个节点, 可以看到当前  层共有4个神经元结点, 即第  层维度为4。我们可以看到, 每行的数据分布都不同。对于第一个神经元, 我们求得  (其中  ), 此时我们利用  对第一行数据(第一个维度)进行normalization得到新的值 。同理我们可以计算出其他输入维度归一化后的值。如下图:通过上面的变换,我们解决了第一个问题,即用更加简化的方式来对数据进行规范化,使得第 ll 层的输入每个特征的分布均值为0,方差为1。如同上面提到的,Normalization操作我们虽然缓解了ICS问题,让每一层网络的输入数据分布都变得稳定,但却导致了数据表达能力的缺失。也就是我们通过变换操作改变了原有数据的信息表达(representation ability of the network),使得底层网络学习到的参数信息丢失。另一方面,通过让每一层的输入分布均值为0,方差为1,会使得输入在经过sigmoid或tanh激活函数时,容易陷入非线性激活函数的线性区域。因此, BN又引入了两个可学习 (learnable) 的参数  与  。这两个参数的引入是为了恢复数据本 身的表达能力, 对规范化后的数据进行线性变换, 即  。特别地, 当  时, 可以实现等价变换(identity transform)并且保留了原始输入特征的分布信 息。通过上面的步骤,我们就在一定程度上保证了输入数据的表达能力。以上就是整个Batch Normalization在模型训练中的算法和思路。补充:在进行normalization的过程中, 由于我们的规范化操作会对减去均值, 因此, 偏置项  可以被忽略掉或可以被置为0, 即
  • [其他] Batch Normalization原理与实战(1)
    作者丨天雨粟@知乎链接丨https://zhuanlan.zhihu.com/p/34879333前言本文主要分为两大部分。第一部分是理论板块,主要从背景、算法、效果等角度对Batch Normalization进行详解;第二部分是实战板块,主要以MNIST数据集作为整个代码测试的数据,通过比较加入Batch Normalization前后网络的性能来让大家对Batch Normalization的作用与效果有更加直观的感知。(一)理论板块理论板块将从以下四个方面对Batch Normalization进行详解:提出背景BN算法思想测试阶段如何使用BNBN的优势理论部分主要参考2015年Google的Sergey Ioffe与Christian Szegedy的论文内容,并辅以吴恩达Coursera课程与其它博主的资料。所有参考内容链接均见于文章最后参考链接部分。1 提出背景1.1 炼丹的困扰在深度学习中,由于问题的复杂性,我们往往会使用较深层数的网络进行训练,相信很多炼丹的朋友都对调参的困难有所体会,尤其是对深层神经网络的训练调参更是困难且复杂。在这个过程中,我们需要去尝试不同的学习率、初始化参数方法(例如Xavier初始化)等方式来帮助我们的模型加速收敛。深度神经网络之所以如此难训练,其中一个重要原因就是网络中层与层之间存在高度的关联性与耦合性。下图是一个多层的神经网络,层与层之间采用全连接的方式进行连接。我们规定左侧为神经网络的底层,右侧为神经网络的上层。那么网络中层与层之间的关联性会导致如下的状况:随着训练的进行,网络中的参数也随着梯度下降在不停更新。一方面,当底层网络中参数发生微弱变化时,由于每一层中的线性变换与非线性激活映射,这些微弱变化随着网络层数的加深而被放大(类似蝴蝶效应);另一方面,参数的变化导致每一层的输入分布会发生改变,进而上层的网络需要不停地去适应这些分布变化,使得我们的模型训练变得困难。上述这一现象叫做Internal Covariate Shift。1.2 什么是Internal Covariate ShiftBatch Normalization的原论文作者给了Internal Covariate Shift一个较规范的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。这句话该怎么理解呢? 我们同样以1.1中的图为例, 我们定义每一层的线性变换为  input , 其中  代表层数; 非线性变换为 , 其中  为 第  层的激活函数。随着梯度下降的进行, 每一层的参数  与  都会被更新, 那么  的分布也就发生了改变, 进而  也同样出现分布的改变。而  作为第  层的输入, 意味着  层就需要去不停 适应这种数据分布的变化, 这一过程就被叫做Internal Covariate Shift。1.3 Internal Covariate Shift会带来什么问题?(1)上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低我们在上面提到了梯度下降的过程会让每一层的参数  和  发生变化,进而使得每一层的线性与非线性计算结果分布产生变化。后层网络就要不停地去适应这种分布变化,这个时候就会使得整个网络的学习速率过慢。(2)网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度当我们在神经网络中采用饱和激活函数 (saturated activation function) 时, 例如sigmoid, tanh 激活函数, 很容易使得模型训练陷入梯度饱和区 (saturated regime)。随着模型训练的进行, 我 们的参数  会逐渐更新并变大, 此时  就会随之变大, 并且  还受 到更底层网络参数  的影响, 随着网络层数的加深,  很容易陷入梯度 饱和区, 此时梯度会变得很小甚至接近于 0 , 参数的更新速度就会减慢, 进而就会放慢网络的收玫 速度。对于激活函数梯度饱和问题,有两种解决思路。第一种就是更为非饱和性激活函数,例如线性整流函数ReLU可以在一定程度上解决训练进入梯度饱和区的问题。另一种思路是,我们可以让激活函数的输入分布保持在一个稳定状态来尽可能避免它们陷入梯度饱和区,这也就是Normalization的思路。1.4 我们如何减缓Internal Covariate Shift?要缓解ICS的问题,就要明白它产生的原因。ICS产生的原因是由于参数更新带来的网络中每一层输入值分布的改变,并且随着网络层数的加深而变得更加严重,因此我们可以通过固定每一层网络输入值的分布来对减缓ICS问题。(1)白化(Whitening)白化(Whitening)是机器学习里面常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。白化是对输入数据分布进行变换,进而达到以下两个目的:使得输入特征分布具有相同的均值与方差。 其中PCA白化保证了所有特征分布均值为0,方差为1;而ZCA白化则保证了所有特征分布均值为0,方差相同;去除特征之间的相关性。通过白化操作,我们可以减缓ICS的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛(LeCun et al.,1998b;Wiesler&Ney,2011)。(2)Batch Normalization提出既然白化可以解决这个问题,为什么我们还要提出别的解决办法?当然是现有的方法具有一定的缺陷,白化主要有以下两个问题:白化过程计算成本太高, 并且在每一轮训练中的每一层我们都需要做如此高成本计算的白化操作;白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力。底层网络学习到的参数信息会被白化操作丢失掉。既然有了上面两个问题,那我们的解决思路就很简单,一方面,我们提出的normalization方法要能够简化计算过程;另一方面又需要经过规范化处理后让数据尽可能保留原始的表达能力。于是就有了简化+改进版的白化——Batch Normalization。2 Batch Normalization2.1 思路既然白化计算过程比较复杂,那我们就简化一点,比如我们可以尝试单独对每个特征进行normalizaiton就可以了,让每个特征都有均值为0,方差为1的分布就OK。另一个问题,既然白化操作减弱了网络中每一层输入数据表达能力,那我就再加个线性变换操作,让这些数据再能够尽可能恢复本身的表达能力就好了。因此,基于上面两个解决问题的思路,作者提出了Batch Normalization,下一部分来具体讲解这个算法步骤。2.2 算法在深度学习中,由于采用full batch的训练方式对内存要求较大,且每一轮训练时间过长;我们一般都会采用对数据做划分,用mini-batch对网络进行训练。因此,Batch Normalization也就在mini-batch的基础上进行计算。
  • [其他] 大模型时代,可信机器学习的未来方向
    最近一年,以 ChatGPT 为代表的大模型取得突破性进展,不仅在各项基准数据集中成绩瞩目,也获得了大量用户的青睐。GPT 系列模型的发展似乎表明,随着模型参数和训练数据不断增多,模型会变得越来越可信。然而,随着研究者的深入调查,人们发现近期的大模型在几个重要方面仍然存在着可信问题。其一,大模型在专业性较强,数据较少的领域鲁棒性不足,性能严重下降或者不稳定。其二,大模型的预测常对一些社会群体带有偏见,缺乏公平性。其三,大模型经常产生 (hallucination),输出一些似是而非的答案。大量证据表明,这些问题并没有随着规模增大得到令人满意的解决方案。RLHF 这一类技术虽然可以使模型产生更符合标注者偏好的输出,但从实际效果上并不能显著提升模型的鲁棒性和公平性。前文介绍的可信机器学习方法具有坚实的理论基础,也在多种场景中验证有效,如果用于训练大模型,将有望提高模型的可信性。然而大模型的训练需要极大的成本,为了改进现有的大模型,可以借助高效使用大模型的技术,如微调 (finetuning),参数高效微调 (parameter-efficient fine-tuning),提示学习 (prompting),以及从人类反馈进行强化学习 (RLHF)。作者对近年来这些技术的发展逐一介绍,并表明前三者采用不同参数化的经验风险最小化 (ERM) 目标,而 RLHF 以学习到的人类奖励作为目标。它们都可以与综述中的主题公式结合,进一步提高模型的可信性。而这种结合的可能性,也是这篇综述在整理现有方法的同时,具备了一定预测未来可能诞生的方法的能力。提高机器学习模型的可信性,在大模型时代尤为重要,这需要研究者和实践者的共同努力。最后,作者探讨了可信机器学习可能的未来方向,如:1. 将不同的可信话题结合起来,训练同时具有多种可信属性的模型;2. 利用因果推理的最新研究进展,推动更有效的可信机器学习方法研究;3. 在更复杂的场景,如多模型的协作中,开发和检验可信机器学习方法。
  • [其他] 因果视角理解可信机器学习
    图灵奖得主 Judea Pearl 提出的因果推理框架关注如何从关联数据中得到稳健的因果关系,消除数据中混淆因子的影响,这正是可信机器学习的核心问题。从因果的角度,可以在数据生成过程中找到混淆因子的产生机制,从而使用因果推断的方法消除其影响。可信机器学习领域的诸多方法,与因果推理的原理不谋而合。不同机器学习任务的数据生成过程多种多样,作者经过调研,选择最普遍的一种展开讨论。假设数据是由两种潜在变量生成的,称其为 “因果变量” 和 “非因果变量”。这两种变量之间存在着非因果的关联;标签变量只由因果变量生成。下图左为数据生成过程的因果图。图 5:左图为数据生成过程的因果图,右图显示对因果特征施加干预后的变化。由于外部的机制取代了生成 C 的机制,图中进入节点 C 的边被取消。按照 Pearl 的因果层次论,因果有三个层级:关联,干预,反事实。作者沿着因果层次介绍重要的因果推理概念及技术,如随机受控实验,工具变量,逆概率加权,后门调整等。作者通过推导说明,如果在数据生成过程中对因果特征进行干预(如上图右所示),可以消除数据中混淆因子的影响,而数据增强和样本加权等方法可以间接实现这种干预。作者从因果的角度重新阐述了上文提到的可信机器学习方法。此外,近年来一些工作提出了明确基于因果推理的机器学习方法,在综述中也进行了介绍。图 6:用以 GAN (左图) 和 VAE (右图) 为代表的生成模型进行数据增强,与反事实推理的相似之处。从因果的角度理解可信机器学习,可以得知现有方法背后的因果假设,判断它们的适用范围。也可以从数据生成过程出发,选择能消除混淆效应的因果技术,从而启发更有效的可信机器学习方法的设计。目前,因果推理在机器学习中的应用还面临诸多挑战,如无法测量的内生变量,以及特征的耦合等等,这些问题仍需要进一步研究和解决。
  • [其他] 连接可信机器学习的不同主题
    在过去的十年里,学术界为了提高机器学习模型的可信性,在鲁棒性、安全性、公平性、可解释性等方面提出了许多方法。尽管这些方法千变万化,但他们之间具有内在的联系。鲁棒性 领域适应 (Domain Adaptation) 可能是最早关注机器学习模型对分布迁移的鲁棒性的方向之一。模型在一个分布的数据上训练,用遵从另一个分布的一些未标注数据适应后,希望模型将在训练集上学到的知识迁移到这个新的分布中,做出准确预测。自领域对抗网络方法问世以来,学习领域不变表示这一思路在鲁棒性研究中迅速普及。另外一大类方法使用生成模型进行数据增强,从训练样本产生符合新的分布风格的样本。与领域适应密切相关的是领域泛化,这个方向关注更有挑战性的场景,即希望模型在来自一个或多个分布的数据上训练后,不需适应能直接在一个未曾见过的新分布上做出准确预测。安全性 作者围绕 “对抗鲁棒性” 的话题展开讨论。一些早期工作发现,可以对图像施加人眼难以察觉的扰动,让图像分类模型做出误判,准确率降到接近零。这种被称为 “对抗攻击” 的方法,和神经网络易受攻击的特性,给包括无人驾驶在内的 AI 应用带来很大的安全隐患。人们对这一现象的本质提出了多种角度的理解,比如认为对抗噪音也是一种特征。为了解决这一问题,最常使用的方法是对抗训练,即用生成的对抗样本和原样本一起训练模型。很多研究也借鉴了领域不变表示的方法。公平性 公平性主要指两个方面的问题:结果歧视、质量差异。前者是指模型根据人的社会群体信息做出带有偏见的预测,后者是指模型对少数群体的预测质量降低。结果歧视问题与领域泛化有类似的结构,可以采用领域不变表示学习,或者数据增强的方法。质量差异往往是某些群体的数据稀少导致的,往往可以通过某种算法对训练样本进行加权来解决。可解释性 打开模型的黑盒子,向用户解释模型预测的理由,对一些涉及重要后果的应用场景十分有必要。可解释性方法可以分为全局解释和局部解释,包括多种形式。作者关注的一类方法旨在揭示模型主要用了输入样本的哪些特征做出预测。实现方法往往涉及对样本进行扰动,或计算输出对特征的梯度,与对抗攻击原理类似。图 3:可信机器学习相同主题的方法总结。(a) 标准 ERM 损失;(b)领域对抗网络方法 ;(c) 最坏情况数据增强策略;(d)样本加权方法。在这份综述中,作者围绕这些可信话题,梳理了近年来各种方法的发展脉络。他们发现,这些为不同话题提出的方法可以用几个主题公式统一起来,如图 3 所示。他们还探讨了这些公式与因果推理框架之间的联系,将在下文介绍。图 4:综述中讨论的几大话题总结。蓝框表示可信话题,红框表示主题公式,绿框表示因果层次。
  • [其他] 可信机器学习(1)
    一、背景随着机器学习模型性能不断强大,它们更加广泛地进入人们的生活,模型的可信性变得尤为重要。人们对模型 “可信” 的要求涵盖很多方面:一个训练好的模型部署到实际中,需要在未知的分布迁移下保持准确预测;为了使用者理解、验证和采信模型做出的高风险预测,模型需要向用户解释其推理过程;模型应该不带偏见地预测,保证对社会各个群体的公平性,等等。研究者们认为,现有的模型之所以不够可信,根源往往在于数据的构成:数据集中广泛存在着混淆因子、虚假特征等结构,即使标注质量再高也无法避免。模型在经验风险最小化 (ERM) 的原则下训练,容易学到这些虚假特征和标签之间的统计关联。这些关联在独立同分布假设下存在,但其本质很脆弱,在真实世界随时可能发生变化,使得模型的性能骤降。此外出于伦理考虑,我们也不希望模型学到某些统计关联,比如在互联网数据中广泛存在的对社会弱势群体的歧视。
  • [其他] ICCV 2023 | 轻量级视觉网络新主干(1)
    1. 背景近年来,基于 Transformer、Large-kernel CNN 和 MLP 三种视觉主干网络在广泛的 CV 任务中取得了显著的成功,这要归功于它们在全局范围内的高效信息融合能力。现有的三大主流神经网络,即 Transformer、CNN 和 MLP,分别通过各自的方式实现全局范围的 Token 融合。其中,Transformer 网络中的自注意力机制将 Query-Key pairs 的相关性作为 Token 融合的权重。CNN 通过扩大 kernel 尺寸实现与 transformer 相近的性能。MLP 通过在所有令牌之间的全连接实现另一种强大的范式。所有这些方法都是有效的,但计算复杂度高 (O (N^2)),难以在存储和计算能力有限的设备上部署,限制了很多模型的应用范围。2. AFF Token Mixer: 轻量、全局、自适应为了解决计算昂贵的问题,研究人员构建了一种名为 Adaptive Fourier Filter(AFF)的高效全局 Token 融合算子。它通过傅里叶变换将 Token 集合变换到频域,同时在频域学习到一个内容自适应的滤波掩膜,对变换到频域空间中的 Token 集合进行自适应滤波操作。论文《Adaptive Frequency Filters As Efficient Global Token Mixers》:根据频域卷积定理,原始域中的卷积操作在数学上等价于对应的傅里叶域中的 Hadamard 乘积操作。这使得该工作所提出的 AFF Token Mixer 在数学上等价于使用一个空间分辨率和 Token 集合一样大小的动态卷积核在原始域中进行 Token 融合 (如下图右子图所示), 具有在全局范围内进行内容自适应 Token 融合的作用。众所周知,动态卷积的计算开销大,大空间分辨率的动态卷积核的使用开销对于高效 / 轻量级网络设计似乎就更加不可接受。但是本文所提出的 AFF Token Mixer 却可以作为同时满足以上优点的低功耗等效实现,将复杂性从 O (N^2) 降低到 O (N log N),显著提高了计算效率。3. AFFNet:轻量级视觉网络新主干研究人员将 AFF Token Mixer 作为主要神经网络操作算子,构建了一个轻量级神经网络,称为 AFFNet。大量实验表明,AFF Token Mixer 在广泛的视觉任务中实现了优越的准确性和效率权衡,包括视觉语义识别和密集预测任务。4. 实验结果研究人员在视觉语义识别、分割、检测等多个视觉任务上对所提出的 AFF Token Mixer 和 AFFNet 进行评测,并将其和目前研究领域中最先进的轻量级视觉主干网络进行对比。实验结果表明,该工作提出的模型设计在广泛的视觉任务上均表现出色,验证了所提出的 AFF Token Mixer 作为新一代轻量高效的 Token 融合算子的潜力。
  • [技术干货] 浅谈行为识别之视频分类的算法
    行为识别和视频分类是计算机视觉领域中非常有挑战性的课题,因为其不仅仅要分析目标体的空间信息,还要分析时间维度上的信息,如何更好的提取出空间-时间特征是问题的关键。从传统特征法到深度学习中的3DCNN,LSTM,Two-Stream。视频分类/行为识别问题行为定位即找到有行为的视频片段,与2D图像的目标定位任务相似。而行为识别即对该视频片段的行为进行分类识别,与2D图像的分类任务相似。视频分类/行为分析重要数据集深度学习任务的提升往往伴随着数据集的发展,视频分类/行为识别相关的数据集非常多,下面介绍一下HMDB-51据集。2.1 HMDB-51HMDB-51共51个类别,6766个短视频。数据集地址:http://serre-lab.clps.brown.edu/resource/hmdb-a-large-human-motion-database/#dataset,发布于2011年。数据来源非常广泛,包括电影,一些现有的公开数据集,YouTube视频等。从中选择了51个类别,每一个类别包含101个以上视频。分为5大类:常见的面部动作(smile,laugh,chew,talk)复杂的面部动作(smoke,eat,drink)常见的肢体动作(climb,dive,jump)复杂的肢体动作(brush hair,catch,draw sword)多人交互肢体动作(hug,kiss,shake hands)深度学习方法当前基于CNN的方法不需要手动提取特征,性能已经完全超越传统方法,以3D卷积,RNN/LSTM时序模型,双流法等模型为代表。  输入层(input): 连续的(7帧)大小为60*40的视频帧图像作为输入。.硬线层(hardwired,H1): 每帧提取5个通道信息(灰度gray,横坐标梯度(gradient-x),纵坐标梯度(gradient-y),x光流(optflow-x),y光流(optflow-y))。前面三个通道的信息可以直接对每帧分别操作获取,后面的光流(x,y)则需要利用两帧的信息才能提取,因此H1层的特征maps数量:(7+7+7+6+6=33),特征maps的大小依然是60* 40;卷积层(convolution C2): 以硬线层的输出作为该层的输入,对输入5个通道信息分别使用大小为7* 7 * 3的3D卷积核进行卷积操作(7* 7表示空间维度,3表示时间维度,也就是每次操作3帧图像),同时,为了增加特征maps的个数,在这一层采用了两种不同的3D卷积核,因此C2层的特征maps数量为:(((7-3)+1)* 3+((6-3)+1)* 2)* 2=23* 2这里右乘的2表示两种卷积核。特征maps的大小为:((60-7)+1)* ((40-7)+1)=54 * 34降采样层(sub-sampling S3): 在该层采用max pooling操作,降采样之后的特征maps数量保持不变,因此S3层的特征maps数量为:23 *2特征maps的大小为:((54 / 2) * (34 /2)=27 *17卷积层(convolution C4): 对两组特征maps分别采用7 6 3的卷积核进行操作,同样为了增加特征maps的数量,文中采用了三种不同的卷积核分别对两组特征map进行卷积操作。这里的特征maps的数量计算有点复杂,请仔细看清楚了我们知道,从输入的7帧图像获得了5个通道的信息,因此结合总图S3的上面一组特征maps的数量为((7-3)+1) * 3+((6-3)+1) * 2=23,可以获得各个通道在S3层的数量分布:前面的乘3表示gray通道maps数量= gradient-x通道maps数量= gradient-y通道maps数量=(7-3)+1)=5;后面的乘2表示optflow-x通道maps数量=optflow-y通道maps数量=(6-3)+1=4;假设对总图S3的上面一组特征maps采用一种7 6 3的3D卷积核进行卷积就可以获得:((5-3)+1)* 3+((4-3)+1)* 2=9+4=13;三种不同的3D卷积核就可获得13* 3个特征maps,同理对总图S3的下面一组特征maps采用三种不同的卷积核进行卷积操作也可以获得13*3个特征maps,因此C4层的特征maps数量:13* 3* 2=13* 6C4层的特征maps的大小为:((27-7)+1)* ((17-6)+1)=21*12降采样层(sub-sampling S5): 对每个特征maps采用3 3的核进行降采样操作,此时每个maps的大小:7* 4在这个阶段,每个通道的特征maps已经很小,通道maps数量分布情况如下:gray通道maps数量= gradient-x通道maps数量= gradient-y通道maps数量=3optflow-x通道maps数量=optflow-y通道maps数量=2;卷积层(convolution C6): 此时对每个特征maps采用7* 4的2D卷积核进行卷积操作,此时每个特征maps的大小为:1*1。对于CNNs,有一个通用的设计规则就是:在后面的层(离输出层近的)特征map的个数应该增加,这样就可以从低级的特征maps组合产生更多类型的特征。
  • [其他] 浅谈大模型的优缺点
    AI大模型是指具有巨大参数量的深度学习模型,通常包含数十亿甚至数万亿个参数。这些模型可以通过学习大量的数据来提高预测能力,从而在自然语言处理、计算机视觉、自主驾驶等领域取得重要突破。AI大模型的定义具体可以根据参数规模来分类。根据OpenAI的分类方法,可以将AI模型分为以下几类:小型模型: ≤ 1百万个参数中型模型:1百万 – 1亿个参数大型模型:1亿 – 10亿个参数极大型模型:≥ 10亿个参数AI“大模型”是基于具有超级大规模的、甚至可以称之为“超参数”的模型,需要大量的计算资源、更强的计算能力以及更优秀的算法优化方法进行训练和优化。优点:智能:AI大模型能够模拟人类的思维和学习模式,通过大量的训练数据,从而提高人工智能的智能性。通用性:AI大模型能够自适应不同的工作和环境,可以适应各种不同的自然语言、视觉和声音数据。准确:AI大模型有更多的参数,能够处理更复杂的信息和更深入的上下文,提高了精度和准确性。高效:AI大模型通过并行计算和分布式训练,大大提高了计算效率,能够在短时间内处理大量的数据。缺点:环境依赖:AI大模型对于使用语言、环境等存在更高的依赖性,需要针对特定场景进行定制和使用。OpenAI承认ChatGPT"有时会写出看似合理但不正确或荒谬的答案",这在大型语言模型中很常见,称作人工智能幻觉。其奖励模型围绕人类监督而设计,可能导致过度优化,从而影响性能,即古德哈特定律。数据集问题:AI大模型需要大量的标注数据,以便训练和优化模型。但实际场景中的数据通常是不完整、不一致和缺乏标注的。计算资源问题:AI大模型需要更多的计算资源,如多台GPU和分布式计算等,高昂的成本阻碍了普及和应用。可解释性问题:AI大模型对于预测结果的解释通常比较困难,难以解释其判断的依据和原因, 使得大模型的使用和应用存在风险和误判的情况。
  • 浅谈AI大模型原理
    AI大模型是指具有巨大参数量的深度学习模型,通常包含数十亿甚至数万亿个参数。这些模型可以通过学习大量的数据来提高预测能力,从而在自然语言处理、计算机视觉、自主驾驶等领域取得重要突破。根据OpenAI的分类方法,可以将AI模型分为以下几类:小型模型: ≤ 1百万个参数中型模型:1百万 – 1亿个参数大型模型:1亿 – 10亿个参数极大型模型:≥ 10亿个参数AI“大模型”是基于具有超级大规模的、甚至可以称之为“超参数”的模型,需要大量的计算资源、更强的计算能力以及更优秀的算法优化方法进行训练和优化。聊聊AI大模型原理AI大模型(如深度学习模型)的原理是基于神经网络和大量数据的训练,模型通过模拟人脑的神经元结构,对输入数据进行多层抽象和处理,从而实现对复杂任务的学习和预测。数据预处理:首先,需要对原始数据进行清洗、整理和标注,以便为模型提供合适的输入。这一阶段可能包括去除噪声、填充缺失值、归一化等操作。构建神经网络:接下来,根据任务需求,设计并搭建一个神经网络。神经网络通常由多个层次组成,每个层次包含若干个神经元。神经元之间通过权重连接,用于表示输入数据与输出数据之间的关系。前向传播:将经过预处理的数据输入到神经网络中,按照权重计算得出各层神经元的输出。这个过程称为前向传播。激活函数:在神经网络的每一层之后,通常会使用激活函数(如ReLU、Sigmoid或Tanh等)对输出进行非线性变换,以增加模型的表达能力。损失函数:为了衡量模型预测结果与真实目标之间的差距,需要定义一个损失函数。损失函数会计算预测误差,并将其作为优化目标。常见的损失函数有均方误差(MSE)、交叉熵损失(Cross-Entropy Loss)等。优化算法:根据损失函数,选择合适的优化算法(如梯度下降、随机梯度下降、Adam等)来更新神经网络中的权重和偏置,以减小损失函数的值。这个过程称为反向传播。训练与验证:重复执行上述步骤,直到模型在训练集上达到满意的性能。为了防止过拟合,还需要在验证集上评估模型的泛化能力。如果发现模型在验证集上的表现不佳,可以调整网络结构、超参数或训练策略等。部署与使用:当模型在训练集和验证集上表现良好时,可以将数据模型进行部署和使用。
  • [其他] 浅谈无监督学习
    OpenAI联合创始人和首席科学家Ilya Sutskever在UC伯克利的一场演讲中提出,希望通过压缩视角来解释无监督学习问题。不过值得一提的是,他指出,GPT模型也可以不通过压缩理念进行理解。基于学习方法,机器学习的大致可分为监督学习和无监督学习两种。在无监督学习中,我们需要用某种算法去训练无标签数据集,从而帮助模型找到这组数据的潜在结构。为了进行无监督学习,在OpenAI成立早期,他们认为通过压缩可以通向这一路径。随后,他们发现“预测下一个词元(token)”正是无监督学习可以追求的目标,并且意识到,预测就是压缩。这也正是后来ChatGPT成功的关键思想之一。他们通过不断训练自回归生成模型实现了数据压缩,如果数据被压缩得足够好,就能提取其中存在的所有隐藏信息。这样GPT模型就可以准确地预测下一个词元,文本生成的准确度也就越高。确定型无监督学习确定型无监督学习主要有自编码及稀疏自编码、降噪自编码等。自编码可以看作是一个特殊的3层BP神经网络,特殊性体现在需要使得自编码网络的输入输出尽可能近似,即尽可能使得编码无损(能够从编码中还原出原来的信息)。虽然稀疏自编码可以学习一个相等函数,使得可见层数据和经过编码解码后的数据尽可能相等,但是其鲁棒性仍然较差,尤其是当测试样本和训练样本概率分布相差较大时,效果较差。为此,Vincent等人在稀疏自编码的基础上提出了降噪自编码,其基本思想是,以一定概率使输入层某些节点的值为0,此时输入到可视层的数据变为x^,隐含层输出为y,然后由重构x的输出z,使得z和x的差值尽可能的小。概率型无监督学习概率型无监督学习的典型代表就是限制玻尔兹曼机,限制玻尔兹曼机是玻尔兹曼机的一个简化版本,可以方便地从可见层数据推算出隐含层的激活状态。
  • [技术干货] 浅谈数据处理(效验,转换,清洗,选择,增强)
    数据处理的目的是让开发者在模型训练之前拿到质量更高的数据集,以提升精度,降低模型训练成本1,数据效验和转换数据效验(对数据可用性进行判断和验证的过程)采集的数据是否有格式的问题,图像名称,后缀不满足训练算法的要求,可能无法识别,和无法解码等情况,因此,数据的效验非常重要,数据的标注格式可能也有很多种。ModelArts数据处理模块提供数据效验功能,对于图像数据,判断标注格式是否相符合要求,图像分辨率是否符合要求,图像通道是否符合算法要求,图像解码是否正常,图像名称和后缀是否满足规范数据转换(对数据进行规范化处理)数据转换是指数据大小,格式,特征等进行变换的过程,数据转换是为了使数据更适合算法选择和模型训练,使数据充分利用如图像有JPEG,PNG等格式,为了满足算法输入要求的格式,比如算法要求图像都是PNG格式,就要将不同的图像格式转换成PNG格式,这就需要转换格式并进行必要的数据整理数据清洗(数据进行去噪,纠错或补全的过程)1,离散化(针对连续的场景特征取值) 2,无量纲化(保持特征之间的公平性,提高模型精准度) 3,缺失值补全  4,分布变换(对数变换,指数变换等) 5,变量解码(文字,字母,频率等)数据选择(特征提取,聚类排序,选择最优子集)数据增强数据增强通过缩放,裁剪,变换,合成等操作直接或者间接增强数据量,进而进一步提升模型的训练精度,结构化数据和非结构化数据都可以做数据增强数据增强可以分为,离线数据增强和在线数据增强数据增强的常见方法1,空间几何变换旋转翻转变换缩放变换平移变换尺度变换2,像素和特征变换对比度变换噪声扰动颜色变化3,样本合成SamplePairingMixUp等
总条数:7868 到第 页
上滑加载中