Jiahong 的个人博客

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Centos——硬盘操作-分区和挂载

  • 参考博客:https://www.cnblogs.com/lizhangshu/p/9719018.html

磁盘分区类型

  • 三种分区
    • 主分区
    • 扩展分区
    • 逻辑分区
  • 分区规则
    • 主分区 + 扩展分区的数量不能超过4个
    • 扩展分区只能有1个
    • 逻辑分区要在扩展分区之上进行划分,逻辑分区没有数量限制,可以任意个
    • 扩展分区是不能直接用的,他是以逻辑分区的方式来使用的,所以说扩展分区可分成若干逻辑分区。他们的关系是包含的关系,所有的逻辑分区都是扩展分区的一部分
  • 硬盘的容量
    • 硬盘容量 = 主分区的容量 + 扩展分区的容量
    • 扩展分区的容量 = 各个逻辑分区的容量之和
  • 为什么 主分区 + 扩展分区数量不能超过4个
    • 主分区就是普通磁盘分盘,但是由于磁盘设备由大量的扇区组成,一个扇区的容量为512字节。磁盘的第一个扇区最为重要,记录了主引导记录与分区表信息。就第一个扇区而言,主引导信息记录需要占用466个字节,分区表64个字节,结束符占用2个字节;其中分区表中每记录一个分区信息就需要16个字节,所以最多只有4个分区信息可以记录在第一个扇区中,所以主分区+扩展分区的数量不能超过4个。但是为了创建更多的分区,就使用扩展分区做份下若干个分区的指针,划分若干个逻辑分区,来满足分区数大于4个的需求。扩展分区不需要挂载,但是可以格式化

分区操作

  • 查看当前设备上的磁盘信息及分区信息

    1
    fdisk -l
  • 选取需要分区的磁盘

    1
    fdisk /dev/[disk_name]
    • 注意这里disk_name是硬盘名不是分区名称
    • 一般来说硬盘名都是sda, sdb, vda, vdb等
    • 一般来说硬盘sda上的分区名成为sda1,sda2等
  • 在进入分区磁盘后打印操作帮助

    1
    m
  • 新建分区

    1
    n
  • 选择是主分区还是扩展分区

    • 主分区

      1
      p
    • 拓展分区

      1
      e
  • 选择分区号[1-4]

    1
    1
  • 起始扇区

    1
    2048
    • 一般默认值即可
  • 结束扇区

    1
    +200G
    • 结束扇区在起始扇区基础上+200G, 表示该分区大小为200G
    • 默认是全部分配给当前分区

格式化分区

  • 先输入

    1
    mkfs.
  • Tab键,查看所有可能的命令

mkfs.bfs mkfs.exfat mkfs.ext3 mkfs.fat mkfs.msdos mkfs.vfat
mkfs.cramfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.ntfs

  • 用法

    1
    mkfs.ntfs
  • 说明:

    • mkfs.ntfs命令可以将文件分区为

挂载分区

  • 新建挂载文件夹

    1
    mkdir /mnt/data
    • 建议新建在/mnt/文件夹下
    • 比如我本地的机器为/mnt/SSD和/mnt/HDD

临时挂载

  • 分区临时挂载

    1
    mount /dev/[part_name] /mnt/[dir_name]
    • 没有文件系统的分区不能挂载
  • 分区临时卸载

    1
    umount /dev/[part_name]

开机重启自动挂载

修改文件
  • 查看想要挂载分区的UUID

    • 查看所有UUID

      1
      blkid
    • 查看某个分区的UUID

      1
      blkid /dev/[part_name]
  • 编辑文件

    1
    vim /etc/fstab
  • 添加

    1
    2
    UUID=[UUID_NUMBER]   /data/[dir_name]  ext4  defaults   0 0
    分区临时卸 挂载路径 分区格式 参数 是否备份 引导分区相关(引导分区为1,其他分区为0或者2)
修改生效的两种方式
  • 使用命令重新加载/etc/fstab的内容

    1
    mount -a
  • 重新启动机器

    • 如果配置有错机器可能无法正常进入系统,但是会进入Emergency模式,我们可以在Emergency模式下修改/etc/fstab然后重新启动来修复问题

Linux——NFS服务器和客户端的配置

以Centos7为例, Ubuntu相似


NFS Server

  • 安装nfs所需的所有组件

    1
    sudo yum -y install nfs*
  • 设置开机启动nfs和rpcbind服务

    1
    2
    systemctl enable rpcbind.service
    systemctl enable nfs-server.service
  • 启动nfs和rpcbind服务

    1
    2
    systemctl start rpcbind.service
    systemctl start nfs-server.service
  • 配置exports文件

    1
    2
    3
    4
    5
    vim /etc/exports
    >>> input
    /home/jiahong/SharedTest *(rw,no_root_squash,no_all_squash,sync)
    /home/jiahong/SharedTest 123.45.6.7(rw,no_root_squash,no_all_squash,sync)
    >>> input done
    • 这里的*号可以使用ip,表示只有这个ip可以访问共享文件
    • 使用*则表示所有ip均可访问,设置多个ip可以访问则可使用多行
  • 使exports的配置生效

    1
    exportfs -rv
    • -r生效
    • -v显示结果
  • 查看是否生效

    1
    exportfs

NFS Client

  • 安装nfs所需的所有组件

    1
    sudo yum -y install nfs*
  • 设置开机启动rpcbind服务

    1
    systemctl enable rpcbind.service
  • 启动rpcbind服务

    1
    systemctl start rpcbind.service
  • 查看服务器哪些目录可以共享

    1
    showmount -e serverip
  • 新建文件夹以作为mount目标

    1
    mkdir -p /mnt/nfs/shared_dir
  • 挂载操作

    1
    mount -t nfs serverip:server_dir client_dir
  • 查看挂载情况

    1
    df -h
  • 解除挂载

    1
    umount client_dir

相关问题

  • 客户端出现以下情况时, 一般是服务器防火墙有问题, 解决方案是下面的解开防火墙的命令

    • mount.nfs: No route to host
    • mount.nfs: Connection timed out
      1
      2
      3
      4
      5
      firewall-cmd --permanent --add-service=rpc-bind
      firewall-cmd --permanent --add-service=mountd
      firewall-cmd --permanent --add-port=2049/tcp
      firewall-cmd --permanent --add-port=2049/udp
      firewall-cmd --reload
  • 客户端出现以下情况时,说明客户端未umount但服务器解除文件夹了

    • mount.nfs: Stale file handle
    • umount: xx/xx: Stale file handle
      1
      2
      3
      umount -lf /xx/xx

      # then mount /xx/xx again

Linux——文件操作

本文记录一些Linux相关文件操作的常见问题


mv操作中断

  • 由于mv操作等价于先执行cp然后执行rm操作
    • 还在cp阶段,原始数据是完整的,删除目标文档就行
    • 如果已经进入rm阶段,那么说明目标文件时完整的,删除原始文件就行

硬链接与软链接

Linux中链接分为两类:硬链接(hard link)和软链接(soft link),软链接又称为符号链接(symbolic link)

  • 如果一个文件有多个硬链接,那么需要所有硬连接都被删除,当前文件才会被删除
    • 原始文件与硬链接是同一个物理地址的两个不同名字
    • 硬链接是相互的(个人理解: 一个普通的文件就可以理解为一个硬链接)
  • 如果一个文件有一个硬链接和多个软链接(符号链接),那么删除符号链接不影响原始文件
    • 只有文件的所有硬链接都没删除后文件才会被删除
    • 文件被删除后软链接也会自动失效,链接路径链接不上

Linux——服务器防火墙配置

本文介绍Linux下服务器防火墙的设置
更详细的描述可以参考博客:https://blog.51cto.com/andyxu/2137046


防火墙总结

  • iptables:内核层面的netfilter网络过滤器来处理
  • firewalld: 交由内核层面的nftables包过滤框架处理

Centos6

Centos6默认使用iptable作为防火墙

查看防火墙状态

1
service iptable status

关闭防火墙

  • 临时

    1
    service iptables stop
  • 永久

    1
    chkconfig iptables off

打开防火墙

  • 临时

    1
    service iptables start
  • 永久

    1
    chkconfig iptables on

Centos7

Centos7默认使用的时firewall作为防火墙, 默认使用systemctl管理服务,接下来介绍systemctl管理firewall服务的操作,其他服务也可用systemctl以类似方法管理,只需将filewall名称换成其他服务名称即可

  • 关于服务名称的命名
    • 一般来说都是正常名称后加上一位’d.service’,比如’firewalld.service’,’mysqld.service’等

安装

  • Centos7自带firewalld
  • Ubuntu:
    1
    sudo apt-get install firewalld

配置文件

  • /usr/lib/firewalld/
    • 系统配置,尽量不修改
  • /etc/firewalld/
    • 用户配置地址

关于systemctl的使用

  • 列出所有服务

    1
    systemctl list-unit-files
  • 列出所有打开的服务

    1
    systemctl list-unit-files|grep enabled
  • 列出某个服务

    1
    systemctl list-unit-files|grep [service name]

查看防火墙状态

1
firewall-cmd --state
  • 输出not running或者running

查看防火墙服务

  • 方法一

    1
    systemctl list-unit-files|grep firewalld.service
    • 输出firewalld.service disabled或者firewalld.service enabled
  • 方法二

    1
    systemctl status firewalld.service
    • 输出更详细的信息

开机启动

  • 禁止

    1
    systemctl disable firewalld.service
  • 允许

    1
    systemctl enable firewalld.service
  • 查看

    1
    systemctl is-enabled firewalld.service;echo $?

启动防火墙服务

  • 启动防火墙后默认只开放22端口,其他端口都关闭

    1
    systemctl start firewalld.service
  • 不能启动的解决方案

    1
    2
    systemctl unmask firewalld.service 
    systemctl start firewalld.service

关闭防火墙服务

  • 1
    systemctl stop firewalld.service

端口相关操作命令

  • 查看所有以开放端口

    1
    firewall-cmd --list-ports
  • 查看某个端口是否开启

    1
    firewall-cmd --query-port=8080/tcp
  • 开放端口

    1
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    • 命令含义:
      • –zone #作用域
      • –add-port=80/tcp #添加端口,格式为:端口/通讯协议
      • –permanent #永久生效,没有此参数重启后失效
  • 重启服务

  • 开放端口后需要重启服务才能生效*

    1
    firewall-cmd --reload
  • 移除指定端口

    1
    firewall-cmd --permanent --remove-port=8080/tcp

防火墙的域

域的作用
  • 一共9种,常用的就一种public,开放时把所有访问该端口的用户当做公共人员,不完全信任,trusted为完全信任:
    • block dmz drop external home internal public trusted work
    • 下面图片来自博客:https://blog.51cto.com/13503302/2095633
  • 在开放端口时,可以为其添加域(默认为public),不同的域代表不同的信任
域的操作
  • 查看默认zone

    1
    firewall-cmd --get-default-zone
  • 修改默认zone

    1
    firewall-cmd --set-default-zone=public

防火墙与SSH登录

默认启动firewall后,防火墙不会打开22端口[已测试],但为何还能正常ssh登录呢?

1
firewall-cmd --list-all

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

  • 从上面的输出中可以看出来ssh服务默认被开启防火墙了,所以无需开启22端口即可使用ssh指令登录到服务器
  • 同时开启的还有dhcpv6-client服务,这个服务用于ipv6的DHCP服务(为什么ipv4不需要这个服务呢?详情参考问答:https://unix.stackexchange.com/questions/176717/what-is-dhcpv6-client-service-in-firewalld-and-can-i-safely-remove-it )

Linux——查看服务器内核和系统版本

本文主要介绍Linux系统的内核版本和系统版本等信息用命令行如何查看


系统类型和版本

Centos

  • 文件存在表示为Centos

    1
    cat /etc/redhat-release
  • 上述指令同时会输出Centos版本

Ubuntu

  • 命令可以执行表示为Ubuntu

    1
    lsb_release -a
  • 执行下面命令可以看出Ubuntu的版本

    1
    cat /etc/issue

更进一步的内核信息

  • 内核名称

    1
    uname -s
  • 结点名称

    1
    uname -n
  • 内核发行号

    1
    uname -r
  • 处理器类型

    1
    uname -p
  • 操作系统

    1
    uname -o

Ubuntu——自动加载bashrc

本文描述了如何为Ubuntu用户创建默认的/.bashrc并设置自动加载/.bashrc


创建.bashrc

  • 如果.bashrc存在,则无需创建,很多程序安装时可能会自动创建,否则,需要我们复制一个

  • 复制命令

    1
    cp /etc/skel/.bashrc ~/
  • 亲测,无需复制,创建一个新的即可


使.bashrc生效

暂时生效

用户重新登录不会生效

1
source ~/.bashrc

永久生效

用户登录后默认生效

  • 新建或打开文件

    1
    vim ~/.profile
  • 添加下面的语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # ~/.profile: executed by Bourne-compatible login shells.

    if [ "$BASH" ]; then
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi
    fi

    mesg n
  • 保存后退出,以后默认的,我们登录后~/.bashrc即可生效

  • 马上生效~/.profile

    1
    source ~/.profile

Linux——rpm和deb包的区别

Linux系统管理之rpm命令的使用


帮助信息

  • 执行man rpm可获取rpm命令的详细帮助信息

Centos

  • yum是用于安装和管理RPM包的
  • RPM包是一种预先在linux机器上被打包好的文件,文件后缀为.rpm,类似于Ubuntu上的deb

yum和rpm的区别

  • yum和rpm都是管理RPM包的
  • yum可以联网下载需要的RPM包
  • yum自己可以处理依赖

Centos安装deb包

  • 安装alien

    1
    2
    3
    4
    5
    6
    7
    # download alien source code
    # uncompress source code
    tar -zxvf alien_x.xx.tar.gz
    cd alien
    # compile
    make
    make install
  • 转换deb包为rpm包

    1
    2
    # generate a rpm package with name xxx.rpm
    alien -r xxx.deb
  • 安装rpm包

    1
    rpm -ivh xxx.rpm

Ubuntu

  • apt-get是用于管理deb包的

Ubuntu上安装rpm包

  • 安装alien

    1
    sudo apt-get install alien
  • 转换

    1
    2
    # generate a deb package with name xxx.deb
    sudo alien xxx.rpm
  • 安装包

    1
    sudo dpkg -i xxx.deb
  • 说明

    • 不是所有的RPM包都能通过alien成功转换成deb包并成功安装的,能找到deb包的最好使用deb包安装

总结

  • Ubuntu使用deb包(apt-get, dpkg),Centos使用RPM包(yum, rpm)
  • deb包和RPM包可互相转换(使用alien包转换即可)

DL——BERT

  • 参考博客:
    • 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
    • BERT详解
  • BERT论文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

BERT之前

Word2Vec的缺点

  • 多义词问题 : 传统的Word Embedding无法识别多义词
    • 确切的说是所有词的固定表征的方式(静态方式)的缺点
    • 所谓静态指的是训练好之后每个单词的表达就固定住了

从Word Embedding到ELMo

ELMo, Embedding from Language Models
根据当前上下文对Word Embedding动态调整的思路

  • ELMo 论文原文: NAACL 2018 Best Paper, Deep contextualized word representations
  • ELMo的本质思想:
    • 事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分
    • 实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示
    • 这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了
  • ELMo是典型的两阶段训练过程: 预训练 + 特征融合?
    • 第一个阶段是利用语言模型进行预训练
    • 第二阶段通过基于特征融合的方式训练
  • ELMo预训练过程示意图
  • ELMo预训练后如何处理下游任务?
    • 预训练训练完成后, 模型训练时使用在线特征抽取,和特征集成的方式对词向量在不同的上下文中进行不同的修正,从而区分多义词
补充知识: 下游任务

下游任务包括很多, 整体上可以分为四大类

序列标注
  • 分词
  • POS Tag
  • NER
  • 语义标注
  • …
分类任务
  • 文本分类
  • 情感计算
  • …
句子关系判断
  • Entailment
  • QA
  • 自然语言推理
  • …
机器翻译
  • 机器翻译
  • 文本摘要
  • …
预训练模型
  • 预训练模型是什么?
    • 预训练模型是指在训练结束是结果比较好的一组权重值,研究人员分享出来供他人使用,基于这些预训练好的权重可以提升我们的模型训练速度和精度
    • 预训练模型能够成功的本质是我们假设预训练模型足够好, 能学到句子的所有信息(包括序列信息等)
  • 两阶段预训练模型如何处理下游任务?
    • 预训练与下游任务无关
      • 预训练阶段是预训练模型自己选择相应的NLP任务,然后让模型在学习处理这些任务的途中实现参数的训练
      • 比如BERT选择的就是MLM(屏蔽语言模型)和NSP(Next Sentence Predition, 下一个句子预测)两个任务来做预训练
    • 不同的下游任务往往需要修改第二阶段中的模型结构等
    • 为适应不同的下游任务, 第二阶段可能使用不同结构, 比如添加Softmax层等方式
ELMo的优缺点
  • 优点:
    • 很好的解决了多义词问题,而且效果非常好
    • 采用上下文来训练词(从上下文预测单词, 上文称为Context-before, 下文称为Context-after)
  • 缺点:
    • 特征提取器没有使用新贵Transformer, 而是传统的LSTM, 特征抽取能力不足

从Word Embedding到GPT

GPT, Generative Pre-Training

  • ELMo的训练方法和图像领域的预训练方法对比,模式不同, ELMo使用的是基于特征融合的预训练方法
  • GPT使用的预训练方法则是在NLP领域开创了和图像领域一致的预训练方法基于Fine-tuning的模式
  • GPT也采用两阶段过程: 预训练 + Fine-tuning
    • 第一个阶段是利用语言模型进行预训练
    • 第二阶段通过Fine-tuning的模式训练
  • GPT预训练后如何处理下游任务?
  • 一些下游任务的Fine-tuning结构

GPT的优缺点

  • 优点:
    • 特征提取器是Transformer,不是RNN, 所以特征提取效果好
  • 缺点
    • GPT使用的是单向语言模型 : 也就是说只用到了上文来预测词
    • 词嵌入时没有单词的下文, 失去了很多信息

BERT结构和原理

下面的讲解都将按照原论文的思路讲解

  • BERT(Bidirectional Encoder Representations from Transformers), 原文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  • 下图是BERT与GPT和ELMo对比的结构图
    • 图中的每个 Trm 组件就是一个 Transformer 的Encoder部分,也就是下图中的左半部分

BERT的特点

  • 一体化特征融合的双向(Bidirectional)语言模型
    • 利用语言的双向信息
    • GPT是单向语言模型, 只能利用一个方向的信息
    • ELMo也是双向语言模型,但是 ELMo实际上是两个方向相反的单向语言模型的拼接, 融合特征的能力比BERT那种一体化的融合特征方式弱
  • 特征提取器:
    • 使用Transformer(实际上使用的是Transformer的Encoder部分, 图中每个)
  • 预训练任务:
    • 屏蔽语言模型(MLM, Masked Language Model) + 相邻句子判断(NSP, Next Sentence Prediction)两个任务的多任务训练目标
  • 训练数据量:
    • 超大规模的数据训练使得BERT结果达到了全新的高度
    • 可以使用BERT作为词嵌入(Word2Vec)的转换矩阵, 实现比其他词嵌入模型更好的结果

输入表示

  • 输入结构图
  • BERT输入是一个512维的编码向量, 是三个嵌入特征的单位和
WordPiece嵌入
  • 对应图中的Token Embedding
  • WordPiece是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡
  • 举例: 原文中 “playing” 被拆分成了 “play” 和 “##ing” 两部分
Segment Embedding

分割嵌入

  • 对应图中的Segment Embedding
  • 用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)
  • 对于句子对,第一个句子的特征值是0,第二个句子的特征值是1, 从而模型可以表达出词出现在前一个句子还是后一个句子
Position Embedding

位置嵌入

  • 对应图中的 Position Embedding
  • 位置嵌入是指将单词的位置信息编码成特征向量
  • 这是继承自论文Google Brain, NIPS 2017: Attention Is All You Need中, 文章中的Transformer架构没有使用RNN,不能编码位置信息,就是在进入Attention前使用了 词嵌入 + 位置嵌入 的方式让模型能够表达位置信息的

预训练

  • 通常预训练是指在训练阶段让模型去解决自然语言任务, 从而训练完成后得到可移植到其他模型(或者当前模型)使用的参数(包括词向量等)
  • BERT的预训练使用了两个NLP任务: MLM + NSP
  • BERT预训练和使用概览:
    • 从上图可以看出, BERT的预训练包含了两方面的任务, NSP和 MLM
    • 实验证明, MLM 优于标准的 LTR(left-to-right)语言模型(OpenAI GPT 使用的就是这个)
屏蔽语言模型(MLM)

Masked Language Model

  • Masked Language Model(MLM)核心思想取自Wilson Taylor在1953年发表的一篇论文“Cloze Procedure”: A New Tool for Measuring Readability
  • 在训练的时候随机从输入预料上屏蔽(Mask)掉一些单词,然后通过的上下文预测该单词(“完形填空”)
  • 传统的语言模型是Left-to-Right(LTR)或者是Right-to-Left(RTL)的, 和 RNN 结构匹配
  • MLM 的性质 和 Transformer 的结构匹配
  • BERT实验中, 有15%的WordPiece Token句子会被屏蔽掉, 在屏蔽的时候,又有不同的概率
  • 如果已经选中(15%概率)要屏蔽 my dog is hairy 中的 hairy, 那么我们的处理方式是:
    • 80%: my dog is hairy -> my dog is [MASK]
    • 10%: my dog is hairy -> my dog is apple
    • 10%: my dog is hairy -> my dog is hairy
    • 防止句子中的某个Token 100%都会被mask掉,那么在Fine-tuning的时候模型就会有一些没有见过的单词
    • 加入随机Token的原因是因为Transformer要保持对每个输入Token的分布式表征,否则模型就会记住这个[MASK]是 Token “hairy”
    • 错误单词带来的负面影响: 一个单词被随机替换掉的概率只有 \(15% \times 10% = 1.5%\) 这个负面影响其实是可以忽略不计的
  • 另外: 文章指出每次只预测15%的单词,因此模型收敛的比较慢
为什么使用MLM
  • 因为效果好,解释就是MLM更符合Transformer的结构
  • 论文中的实验结果:
    • MNLI(Multi-Genre Natural Language Inference)是多类型自然语言推理任务, 是一个大规模的众包蕴含分类任务, 给定一个句子,目标是预测第二句相对与第一句是一个蕴含语句, 矛盾语句, 还是中性语句
    • 从图中可以看出,在MNLI任务中, MLM预训练 + MNLI Fine-tuning 的效果明显优于 LTR预训练 + MNLI Fine-tuning 的效果
相邻句子预测(NSP)

Next Sentence Prediction

  • NSP 的任务是判断句子B是否是句子A的下文
  • 图中的[CLS]符号就是用于分类的, 如果是的话输出’IsNext‘,否则输出’NotNext‘
  • 训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext的
  • 举例来说:
    • Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
    • Label = IsNext
    • Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
    • Label = NotNext

Fine-tuning 处理下游任务

Fine-tining, 中文也称为微调

  • 下图是BERT在不同任务的的微调方法

  • 第二阶段,Fine-Tuning阶段,这个阶段的做法和GPT是一样的。当然,它也面临着下游任务网络结构改造的问题,在改造任务方面Bert和GPT有些不同

    • 句子类关系任务: 和GPT一样,增加起始和终结符号,输出部分Transformer最后一层每个单词对应部分都进行分类即可
    • 除了生成任务外, 其他任务Bert都涉及到了

BERT的使用

  • Google公开了两个不同规模的 BERT模型:
    • ** \(BERT_{BASE}\) ** : 110M模型参数
    • ** \(BERT_{LARGE}\) ** : 340M模型参数
  • 同时公开了两个模型在大规模数据预训练后的参数集合, 供开发者下载和使用

基于BERT的新秀

  • Token仍然使用词, 但是MLM屏蔽时选择屏蔽短语或者实体

ERNIE from Baidu

  • 参考文章: [ERNIE: Enhanced Representation through Knowledge Integration]
  • 核心思想:
    • 用先验知识来加强预训练模型(考虑实体,短语等级别的屏蔽)
    • 在BERT的预训练阶段, MLM模型中屏蔽一个实体(Entity)或者短语(Phrase)而不是屏蔽一个字(Word)
  • 文中提出三种级别的屏蔽方式
    • 基本级别(Basic-level)
    • 实体级别(Entity-level)
    • 短语级别(Phrase-level)
实验对比

ERINE from THU

  • 参考文章: ERNIE: Enhanced Language Representation with Informative Entities
  • 核心思想:
    • 利用先验知识来加强预训练模型(引入知识图谱)
    • 提出了将知识纳入语言表达模型的方法
    • 使用知识聚合器(Knowledgeable aggregator)和预训练任务 dEA, 更好的融合来自文本和知识图谱的异构信息
  • 知识信息
  • 模型架构

DL——CTR预估负样本采样修正


适用场景

  • 在CTR预估模型中,通常需要对负样本进行采样,以提升训练效率
  • 负样本采样会改变样本分布,从而导致预估均值出现偏差

问题描述

  • 假设对负样本进行采样,此时数据分布(正负样本比例)会发生改变,为了保证预估均值,需要对模型进行修正

修正方式

  • 修正方式一般有两种

训练时修正

  • 灵活,可以在训练时考虑到修正,保证训练后的模型可以直接使用

    训练后修正

  • 不常用,需要记录训练时的采样率等,容易出现问题

推导

训练时修正推导

  • 假设原始样本数,正样本数,负样本数分别为 \(N,N_p,N_n\)

  • 采样前:

    • 令正样本概率为 \(p = \frac{N_p}{N}\),则有 \(1-p = \frac{N_n}{N}\)
    • 进一步有: \(\frac{p}{1-p} = \frac{N_p}{N_n}\)
  • 按照比例 \(r\) 对负样本进行采样后剩下负样本数为 \(r\cdot N_n\):

    • 同理有: \(\frac{p’}{1-p’} = \frac{N_p}{N_n/r} = r\cdot\frac{N_p}{N_n}\)
  • 假定CTR的输出经过sigmoid激活函数输出概率值

  • 为了保证预估时可以使用如下公式:
    $$ p = \frac{1}{1+e^{-wx}} $$

  • 需要满足的训练公式为:
    $$ p‘ = f(x) $$

  • 求解 \(f\) 的流程如下:

    • 由sigmoid函数(\(p = \frac{1}{1+e^{-wx}}\))的定义可得:
      $$ wx = ln \frac{p}{1-p} $$
    • 又因为:
      $$
      \frac{p}{1-p} = \frac{N_p}{N_n} \\
      \frac{p’}{1-p’} = \frac{1}{r}\cdot\frac{N_p}{N_n} \\
      ln(\frac{p’}{1-p’}) = ln(\frac{1}{r}\cdot\frac{p}{1-p}) = ln(\frac{1}{r}) + ln(\frac{p}{1-p}) \\
      $$
    • 所以有:
      $$ ln(\frac{p’}{1-p’}) = ln(\frac{1}{r}) + ln(\frac{p}{1-p}) = ln(\frac{1}{r}) + wx $$
    • 于是有预估时的公式为:
      $$ p’ = \frac{1}{1+e^{-(wx+ln(\frac{1}{r}))}} $$
  • 综上所述,训练时下面的式子训练:
    $$ p’ = \frac{1}{1+e^{-(wx+ln(\frac{1}{r}))}} $$

  • 预估时可以按照下面的式子预估:
    $$ p = \frac{1}{1+e^{-wx}} $$

训练后修正的推导

  • 由两者的定义可以推导如下:
    $$
    \frac{p}{1-p} = \frac{N_p}{N_n} \\
    \frac{p’}{1-p’} = \frac{1}{r}\cdot\frac{N_p}{N_n} \\
    $$
  • 进一步有:
    $$
    \frac{p’}{1-p’} = \frac{1}{r}\cdot\frac{p}{1-p} \\
    \frac{p}{1-p} = r \cdot \frac{p’}{1-p’} = \frac{r \cdot p’}{1-p’} \\
    $$
  • 调整位置得到:
    $$
    \frac{1-p}{p} = \frac{1-p’}{r \cdot p’} \\
    $$
  • 即:
    $$
    \frac{1}{p} - 1 = \frac{1-p’}{r \cdot p’} \\
    $$
  • 进而有:
    $$
    \frac{1}{p} = \frac{r \cdot p’+1-p’}{r \cdot p’} \\
    $$
  • 最终得到:
    $$
    p = \frac{r \cdot p’}{r \cdot p’+1-p’} \\
    p = \frac{ p’}{p’+\frac{1-p’}{r}}\\
    $$
  • 综上所述,训练时下面的式子训练:
    $$ p’ = \frac{1}{1+e^{-wx}} $$
  • 预估时可以按照下面的式子预估:
    $$ p = \frac{ p’}{p’+\frac{1-p’}{r}} $$

DL——NNLM

神经网络语言模型(Nerual Network Language Model, NNLM)

参考论文: A Neural Probabilistic Language Model
参考博客: 神经网路语言模型(NNLM)的理解


概率模型

  • 传统的 \(n\) 元语言模型:
    $$(p(w_{t}|w_{t-(n-1)},…,w_{t-1}))$$
  • 一般来说可以通过前 \(n-1\) 个词将预测第 \(n\) 个词的概率分布

NNLM模型原理

  • NNLM 模型直接通过一个神经网络结构对 \(n\) 元条件概率进行评估

模型结构

  • NNLM 网络结构图如下:

数据集预处理

  • 对于给定的预料库,我们需要生成训练数据集(大量训练样本的集合),单个样本如下是长度为n的序列 \((w_{1},…,w_{n})\),其中 \((w_{1},…,w_{n-1})\) 对应训练样本特征值,训练样本标记为 \(w_{n}\),通常可以用One-Hot编码(一个维度为|V|的向量)

模型分析

模型分析主要介绍前向传播过程

输入与输出
  • 将构造的数据集作为训练样本集
  • 其中每个样本输入为 \((w_{1},…,w_{n-1})\),输出为一个向量(维度为 |V|),向量代表词的分布,该分布应该与词 \(w_{n}\) 的 One-Hot 编码(也是一个 |V| 维向量)尽量匹配,输出误差就是这两个向量的差异大小(不同损失函数均通过将上述两个向量作为输入,输出一个标量等(也可能 \(n\) 为向量,此时按照不同维度分别计算,或者是其他的值)从而实现当前样本损失的计算
模型结构分析
  • \(x=(C_{j|w_{j}=w_{1}};…;C_{j|w_{j}=w_{n-1}})\)

    • \(x\) 为输入向量, \(x\in R^{(n-1)m}\),\(x\) 是词序列 \((w_{1},…,w_{n-1})\) 对应的拼接向量,其中每个词都会先被矩阵C映射成一个m维的向量,将 \((n-1)\) 维的向量拼接起来就得到了 \(x\)
  • \(y=b+Wx+Utanh(d+Hx)\)

    • \(y\) 为输出向量, \(y\in R^{|V|}\), \(y_{i}\) 表示 \(w_{i}\) 是第 \(n\) 个单词的概率
模型参数分析
  • C:映射矩阵 \(C\in R^{|V|\times m}\),其中矩阵的第 \(j\) 行 \(C_{j}\) 是词 \(w_{j}\) 对应的特征向量, \(m\) 为特征向量的维度

  • H:输入层到隐含层的权重矩阵 \(H\in R^{(n-1)m\times h}\),其中 \(h\) 为隐含层神经元的数量

  • W:输入层到输出层的权重矩阵 \(W\in R^{(n-1)m\times |V|}\), \(W\) 是可选参数,对应模型结构图中的绿色虚线,如果输入层输出层不直接相连,则直接令 \(W=0\) 即可

  • U:隐含层到输出层的权重矩阵 \(U\in R^{h\times |V|}\)

  • b:输出层的偏执参数

  • d:隐含层的偏执参数

模型训练

损失函数
  • 似然函数:\(L(\theta)=\prod_{t=1}^{T} p(w_{t-(n-1)},…,w_{t-1},w_{t}|\theta)+R(\theta)\)
    • T 为训练集 D 中的样本总数,即 \(T=|D|\)
    • \(R(\theta)\) 是正则项
  • 对数似然函数:\(L(\theta)=\sum_{t=1}^{T}\log(p(w_{t-(n-1)},…,w_{t-1},w_{t})|\theta) + R(\theta)\),其中T为训练集 D 中的样本总数,即 \(T=|D|\)
  • 我们选择优化对数似然函数,原因如下:
    • 似然函数连乘操作造成浮点数溢出,乘积越来越小(概率值都在[0,1]之间)
    • 似然函数连乘操作耗时大于对数似然函数的连加操作
    • 取对数的操作可以同时把函数中其他的指数项(比如出现在正则项 \(R(\theta)\) 中)中的处理成连加,减少运算量
    • 对数似然函数的单调性与似然函数相同,最大化对数似然函数等价于最大化似然函数(最重要的一点)
训练目标
  • 最大化对数似然函数(等价于最大化似然函数)
参数迭代
  • 使用梯度上升法,每轮迭代时朝着正梯度方向移动
    • \(\theta=\theta+\lambda\frac{\partial L(\theta)}{\partial\theta}\)
    • \(\lambda\) 为步长

总结

  • NNLM 模型使用了低维连续的词向量对上文进行表示,这解决了词袋模型带来的数据稀疏、语义鸿沟等问题
  • 相比传统模型,NNLM 是一种更好的n元语言模型(NNLM的 \(n\) 元不是由神经元决定,而是在根据语料库生成训练数据时单个训练样本中包含的词数,也就是窗口大小)
    • n元模型指的是跟军前 \(n-1\) 个词预测第 \(n\) 个词的语言模型,而不是根据前 \(n\) 个词生成第 \(n+1\) 个词的模型
  • 根据相似的上下文语境,NNLM 模型可以预测出相似的目标词,而传统模型无法做到这一点
1…434445…66
Joe Zhou

Joe Zhou

Stay Hungry. Stay Foolish.

659 posts
53 tags
GitHub E-Mail
© 2026 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4