DL基本知识(七)FTRL优化器

2023-05-16

契机

最近工作方向为缩减模型规模,切入点为L1正则化,选择该切入点的理由如下,

众所周知,L1正则化能令权重矩阵更稀疏。在推荐系统中特征多为embedding,权重矩阵稀疏意味着一些embedding_weight为0,模型部署时这些embedding不会导出,从而达到缩减模型规模的目的,这样做有3个好处:

  1. 性能更好:小模型部署快,这点对于实时训练很重要,因为较多时间会花在模型部署上,部署快意味着更快的模型迭代,
  2. 内存更小:这点毋庸置疑,
  3. 效果更好:在适当参数配置下,L1正则化干掉的特征一般不重要,这样模型被这些特征干扰的概率降低,效果会更好。

但是,随着随机梯度下降(SGD)的应用,L1正则化后的模型稀疏程度下降,理由正如冯扬大神所述。FTRL正是在这个环境下诞生的,其核心目的在于解决模型稀疏化问题

备注:下文所有的稀疏性都为权重稀疏性。

发展历程

L1正则化

直接上权重更新公式:
W ( t + 1 ) = W ( t ) − η ( t ) G ( t ) − η ( t ) λ s g n ( W ( t ) ) W^{(t+1)}=W^{(t)}-\eta^{(t)}G^{(t)}-\eta^{(t)}\lambda sgn(W^{(t)}) W(t+1)=W(t)η(t)G(t)η(t)λsgn(W(t))
其中 W ( t ) W^{(t)} W(t)代表训练第 t t t步时的权重, η ( t ) \eta ^{(t)} η(t)代表学习率, G ( t ) G^{(t)} G(t)代表梯度, λ \lambda λ代表L1正则化参数, s g n ( ⋅ ) sgn(\cdot) sgn()为符号函数,这里 s g n ( W ( t ) ) sgn(W_{(t)}) sgn(W(t)) ∣ W ( t ) ∣ |W_{(t)}| W(t)的导数。

简单截断法

既然L1正则化后的权重依然不为0,则直接在让权重在比较小时截断为0,这样在一定程度上直接解决稀疏化问题,具体公式如下,
W ( t + 1 ) = T 0 ( W ( t ) − η ( t ) G ( t ) , θ ) W^{(t+1)}=T_0(W^{(t)}-\eta ^{(t)}G^{(t)},\theta) W(t+1)=T0(W(t)η(t)G(t),θ)
其中 T 0 ( v i , θ ) T_0(v_i,\theta) T0(vi,θ)为截断函数,具体形式如下,
T 0 ( v i , θ ) = { 0      i f   ∣ v i ∣ ≤ θ v i      o t h e r w i s e T_0(v_i,\theta)=\left\{\begin{matrix} 0 \ \ \ \ if \ \left | v_i \right | \leq \theta\\ v_i \ \ \ \ otherwise \end{matrix}\right. T0(vi,θ)={0    if viθvi    otherwise
实际操作时,如果 t / k t/k t/k不为整数时按正常SGD进行迭代,否则则采用上述公式进行权重更新。具体示意图如下所示,

TG

简单截断法太过暴力,参数控制不好效果会有损,之后便诞生了Truncated Gradient算法(简称为TG),具体公式如下,
W ( t + 1 ) = T 1 ( W ( t ) − η ( t ) G ( t ) , η ( t ) λ ( t ) , θ ) W^{(t+1)}=T_1(W^{(t)}-\eta^{(t)}G^{(t)},\eta^{(t)}\lambda^{(t)},\theta) W(t+1)=T1(W(t)η(t)G(t),η(t)λ(t),θ)
其中 λ ( t ) \lambda^{(t)} λ(t)为另一个限制阈值, T 1 ( v i , α , θ ) T_1(v_i,\alpha,\theta) T1(vi,α,θ)为TG算法的截断函数,具体形式如下,
T 1 ( v i , α , θ ) = { m a x ( 0 , v i − α )           i f   v i ∈ [ 0 , θ ] m i n ( 0 , v i + α )        i f   v i ∈ [ − θ , 0 ] v i                                   o t h e r w i s e T_1(v_i,\alpha,\theta)=\left\{\begin{matrix} max(0,v_i -\alpha) \ \ \ \ \ \ \ \ \ if \ v_i \in \left [ 0,\theta \right ]\\ min(0,v_i +\alpha) \ \ \ \ \ \ if \ v_i \in \left [ -\theta,0 \right ]\\ v_i \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ otherwise \end{matrix}\right. T1(vi,α,θ)=max(0,viα)         if vi[0,θ]min(0,vi+α)      if vi[θ,0]vi                                 otherwise
实际操作时,类似简单截断法,每 k k k步截断一次,当 t / k t/k t/k不为整数时 λ ( t ) = 0 \lambda^{(t)}=0 λ(t)=0,否则 λ ( t ) = k λ \lambda^{(t)}=k\lambda λ(t)=kλ,可以看出 λ \lambda λ θ \theta θ同时控制权重稀疏性,越大稀疏性越好。具体示意图如下所示,

根据上述讲解,可以看出TG可以变换为简单截断法,也可以转换为L1正则化,
  1. TG -> 简单截断法
  1. TG -> L1正则化

L1-FOBOS

更进一步,FOBOS核心思想是既考虑上一次迭代结果,也寻求本阶段最优,具体公式如下,
W ( t + 1 2 ) = W ( t ) − η ( t ) G ( t )                                                         ( 1 ) W ( t ) = a r g m i n W { 1 2 ∥ W − W ( t + 1 2 ) ∥ 2 + η ( t + 1 2 ) Ψ ( W ) }       ( 2 ) \begin{matrix} W^{(t+\frac{1}{2})}=W^{(t)}-\eta^{(t)}G^{(t)} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1)\\ W^{(t)}=argmin_W\left \{ \frac{1}{2}\left \| W-W^{(t+\frac{1}{2})} \right \|^2+\eta^{(t+\frac{1}{2})}\Psi (W) \right \}\ \ \ \ \ (2) \end{matrix} W(t+21)=W(t)η(t)G(t)                                                       (1)W(t)=argminW{21WW(t+21)2+η(t+21)Ψ(W)}     (2)

上述公式中第(1)步为标准的随机梯度下降,第(2)步是在当前基础上对结果进行微调。经过一套复杂推导公式(此处省略一万个公式),得到如下结果,
w i ( t + 1 ) = s g n ( w i ( t ) − η ( t ) g i ( t ) ) m a x { 0 , ∣ w i ( t ) − η ( t ) g i ( t ) ∣ − η ( t + 1 2 ) λ } w_i^{(t+1)}=sgn(w_i^{(t)}-\eta^{(t)}g_i^{(t)})max\left \{ 0,\left | w_i^{(t)}-\eta^{(t)}g_i^{(t)} \right | -\eta^{(t+\frac{1}{2})}\lambda\right \} wi(t+1)=sgn(wi(t)η(t)gi(t))max{0,wi(t)η(t)gi(t)η(t+21)λ}
公式的另一种展现形式为:
w i ( t + 1 ) = { 0                                                   i f   ∣ w i ( t ) − η ( t ) g i ( t ) ∣ ≤ η ( t + 1 2 ) λ ( w i ( t ) − η ( t ) g i ( t ) ) − η ( t + 1 2 ) λ s g n ( w i ( t ) − η ( t ) g i ( t ) )      o t h e r w i s e w_i^{(t+1)}=\left\{\begin{matrix} 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if \ \left | w_i^{(t)}-\eta^{(t)}g_i^{(t)} \right | \leq \eta^{(t+\frac{1}{2})}\lambda \\ \left ( w_i^{(t)}-\eta^{(t)}g_i^{(t)} \right )-\eta^{(t+\frac{1}{2})}\lambda sgn\left ( w_i^{(t)}-\eta^{(t)}g_i^{(t)} \right ) \ \ \ \ otherwise \end{matrix}\right. wi(t+1)=0                                                 if wi(t)η(t)gi(t)η(t+21)λ(wi(t)η(t)gi(t))η(t+21)λsgn(wi(t)η(t)gi(t))    otherwise
可以看出当一条样本产生的梯度,不足以令对应维度上权重产生足够大的变化,本维度不重要,权重被置为0,从而解决稀疏化问题。

L1-RDA

上述方法都是在随机梯度下降基础上进行改进的,而RDA另辟蹊径,具体公式如下,
W ( t + 1 ) = a r g m i n W { 1 t ∑ r = 1 t ⟨ G ( r ) , W ⟩ + λ ∣ ∣ W ∣ ∣ 1 + γ 2 t ∣ ∣ W ∣ ∣ 2 2 } W^{(t+1)}=argmin_W\left \{ \frac{1}{t}\sum_{r=1}^t\left \langle G^{(r)},W \right \rangle +\lambda ||W||_1+ \frac{\gamma}{2\sqrt{t}}||W||^2_2\right \} W(t+1)=argminW{t1r=1tG(r),W+λW1+2t γW22}
其中 ⟨ G ( r ) , W ⟩ \left \langle G^{(r)},W \right \rangle G(r),W为梯度 G ( r ) G^{(r)} G(r) W W W的积分平均值, λ ∣ ∣ W ∣ ∣ 1 \lambda ||W||_1 λW1为L1正则化项, { γ 2 t ∣ t ≥ 1 } \left \{ \frac{\gamma}{2\sqrt{t}}|t \geq 1\right \} {2t γt1}为一个非负非递减序列。经过一套复杂推导公式(此处省略一万个公式),得到如下结果,
w i ( t + 1 ) = { 0                                               i f   ∣ g i ˉ ( t ) ∣ < λ − t γ ( g i ˉ ( t ) − λ s g n ( g i ˉ ( t ) ) )            o t h e r w i s e w_i^{(t+1)}=\left\{\begin{matrix} 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if \ \left | \bar{g_i}^{(t)} \right |< \lambda \\ -\frac{\sqrt{t}}{\gamma}\left ( \bar{g_i}^{(t)}-\lambda sgn(\bar{g_i}^{(t)}) \right ) \ \ \ \ \ \ \ \ \ \ otherwise \end{matrix}\right. wi(t+1)={0                                             if giˉ(t)<λγt (giˉ(t)λsgn(giˉ(t)))          otherwise
其中 g i ˉ ( t ) = 1 t ∑ r = 1 t g i ( t ) \bar{g_i}^{(t)}=\frac{1}{t}\sum_{r=1}^t g_i^{(t)} giˉ(t)=t1r=1tgi(t),可以看出当某个维度产生的累加梯度平均值的绝对值小于 λ \lambda λ,本维度不重要,权重被置为0,从而解决稀疏化问题。

L1-RDA vs L1-FOBOS

这里对两种方法的公式做进一步的变形,从而很好地比较这两种方法的不同:

L1-FOBOS: W ( t + 1 ) = a r g m i n W { G ( t ) ⋅ W + λ ∥ W ∥ 1 + 1 2 η ( t ) ∥ W − W ( t ) ∥ 2 2 } W^{(t+1)}=argmin_W\left \{ G^{(t)}\cdot W + \lambda \left \| W \right \|_1+\frac{1}{2\eta^{(t)}} \left \| W-W^{(t)} \right \|^2_2 \right \} W(t+1)=argminW{G(t)W+λW1+2η(t)1WW(t)22}
L1-RDA: W ( t + 1 ) = a r g m i n W { G ( 1 : t ) ⋅ W + t λ ∥ W ∥ 1 + 1 2 η ( t ) ∥ W − 0 ∥ 2 2 } W^{(t+1)}=argmin_W\left \{ G^{(1:t)}\cdot W + t\lambda \left \| W \right \|_1+\frac{1}{2\eta^{(t)}} \left \| W-0 \right \|_2^2 \right \} W(t+1)=argminW{G(1:t)W+tλW1+2η(t)1W022}
其中 G ( 1 : t ) = ∑ r = 1 t G ( r ) G^{(1:t)}=\sum^t_{r=1}G^{(r)} G(1:t)=r=1tG(r),可以看出L1-FOBOS和L1-RDA的区别为:

  1. 对于上述两个公式前两项,前者计算当前梯度和L1正则化项,后者采用累加梯度和L1正则化项,
  2. 对于上述两个公式第三项,前者限制 W W W不能离当前迭代的 W ( t ) W^{(t)} W(t)太远,后者则只要求不能离0太远。

FTRL

FTRL是综合L1-RDA和L1-FOBOS后提出的算法,公式如下,这里引入L2正则化是为了令结果变得更平滑。
W ( t + 1 ) = a r g m i n W { G ( 1 : t ) ⋅ W + λ 1 ∥ W ∥ 1 + λ 2 1 2 ∥ W ∥ 2 2 + 1 2 ∑ r = 1 t σ ( r ) ∥ W − W ( r ) ∥ 2 2 } W^{(t+1)}=argmin_W\left \{ G^{(1:t)}\cdot W + \lambda_1 \left \| W \right \|_1 + \lambda_2 \frac{1}{2} \left \| W \right \|^2_2+\frac{1}{2}\sum_{r=1}^t\sigma^{(r)}\left \| W-W^{(r)} \right \|^2_2\right \} W(t+1)=argminW{G(1:t)W+λ1W1+λ221W22+21r=1tσ(r)WW(r)22}
经过一套复杂推导公式(此处省略一万个公式),得到如下结果,
w i ( t + 1 ) = { 0                                                                        i f   ∣ z i ( t ) ∣ < λ 1 − ( λ 2 + ∑ r = 1 t σ ( r ) ) − 1 ( z i ( t ) − λ 1 s g n ( z i ( t ) ) )       o t h e r w i s e w_i^{(t+1)}=\left\{\begin{matrix} 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if \ \left | z_i^{(t)}\right |<\lambda_1 \\ -\left ( \lambda_2+\sum_{r=1}^t\sigma^{(r)} \right )^{-1}\left ( z_i^{(t)}-\lambda_1 sgn(z_i^{(t)}) \right ) \ \ \ \ \ otherwise \end{matrix}\right. wi(t+1)=0                                                                      if zi(t)<λ1(λ2+r=1tσ(r))1(zi(t)λ1sgn(zi(t)))     otherwise
其中 z i ( t ) = g i ( 1 : t ) − ∑ r = 1 t σ ( r ) w i ( r ) z_i^{(t)}=g_i^{(1:t)}-\sum_{r=1}^t\sigma^{(r)}w_i^{(r)} zi(t)=gi(1:t)r=1tσ(r)wi(r),且FTRL中学习率为如下公式,
η i ( t ) = α β + ∑ r = 1 t ( g i ( r ) ) 2 \eta_i^{(t)}= \frac{\alpha}{\beta+\sqrt{\sum_{r=1}^t}\left ( g_i^{(r)} \right )^2} ηi(t)=β+r=1t (gi(r))2α
可以看出,FTRL确实综合了L1-RDA和L1-FOBOS的优点,在实时训练中使用该算法会模型的稀疏性很好,因为它考虑累积权重和累积梯度。

group lasso

在NLP和搜推广领域,输入特征多为embedding,模型对这类特征进行稀疏性处理时,需要在vector-wise层面考虑一组(group)权重参数的置0处理,传统FTRL算法只能在bit-wise层面对权重参数进行处理,因而不能满足需求,因而group lasso优化器应运而生,具体公式如下所示,
W ( t + 1 ) = a r g m i n W { G ( 1 : t ) ⋅ W + 1 2 ∑ r = 1 t σ ( r ) ∥ W − W ( r ) ∥ 2 2 + Ψ ( W ) } W^{(t+1)}=argmin_W\left \{ G^{(1:t)}\cdot W +\frac{1}{2}\sum_{r=1}^t\sigma^{(r)}\left \| W-W^{(r)} \right \|^2_2 + \Psi(W) \right \} W(t+1)=argminW{G(1:t)W+21r=1tσ(r)WW(r)22+Ψ(W)}
其中 Ψ ( W ) \Psi(W) Ψ(W)如下所示,
Ψ ( W ) = ∑ g = 1 G ( λ 1 ∥ W g ∥ 1 + λ 21 d W g ∥ A t 1 2 W g ∥ 2 ) + λ 2 ∥ W ∥ 2 2 \Psi(W)=\sum_{g=1}^G\left ( \lambda_1\left \| W^g \right \|_1+\lambda_{21}\sqrt{d_{W^g}}\left \| A_t^{\frac{1}{2}}W^g \right \|_2 \right )+\lambda_2\left \| W \right \|_2^2 Ψ(W)=g=1G(λ1Wg1+λ21dWg At21Wg2)+λ2W22
其中 G G G为embedding的个数, W g W^g Wg为某个embedding对应的一组权重参数, d W g d_{W^g} dWg W g W^g Wg的维度, λ 1 \lambda_1 λ1为L1正则化系数, λ 21 \lambda_{21} λ21为L21正则化系数, λ 2 \lambda_{2} λ2为L2正则化系数, A t A_t At与当前学习率的非线性表示,具体内容可以参见这里,从上面公式看出,group lasso算法对embedding对应权重参数组的稀疏性处理地较好。

在真正的工程实践中,发现group lasso与FTRL有两点不同:

  1. group lasso保存的模型要比FTRL大很多,因为group lasso规定 W g W^g Wg全为0时embedding才不会被导出,条件比FTRL更严苛,
  2. 同样L1和L2正则化参数和学习率下,group lasso效果要比FTRL好很多,因为group lasso更适合针对embedding做正则化。

参考文献

  1. 冯扬_在线最优化求解
  2. group lasso论文
  3. 次梯度
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DL基本知识(七)FTRL优化器 的相关文章

  • 媒体服务器文件夹显示不全,长文件名显示不全的解决办法

    首页 gt 新闻动态 长文件名显示不全的解决办法 很多时候我们为了方便 xff0c 会给文件取一些很长的文件名 xff0c 十几个汉字算是小意思了 xff0c 有的直接就将内容概要放入文件名中 虽然现在的操作系统都支持这样的长文件名 文件名
  • 服务器启动显示配置内存溢出,服务器解决内存溢出启动

    服务器解决内存溢出启动 内容精选 换一换 华为云帮助中心 xff0c 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 xff0c 帮助您快速上手使用华为云服务 调用API出错后 xff0
  • 官方源码包安装MariaDB-server10.6.8

    文章目录 官方源码包安装MariaDB server10 6 81 下载源码包 xff0c 解压文件2 安装依赖和创建运行用户3 编译安装4 修改环境变量5 初始化数据库 xff0c 默认以root用户登录 xff0c 初始无密码6 启动测
  • 多实例启动mariadb10.6.8(源码安装)

    文章目录 多实例启动mariadb10 6 8 xff08 源码安装 xff09 1 源码安装mariadb10 6 8的情况介绍2 多实例配置2 1 创建各种配置文件2 2 创建启动脚本2 3 配置启动脚本并启动服务2 4 连接测试2 5
  • 基于tensorflow的图像处理(一)TFRecord输入数据格式

    参考 基于tensorflow的图像处理 一 TFRecord输入数据格式 云 43 社区 腾讯云 TensorFlow提供了一种统一的格式来存储数据 xff0c 这个格式就是TFRecord xff0c TFRecord文件中的数据都是通
  • RabbitMQ一对多使用

    在开发工作中 xff0c 我们使用RabbitMQ进行系统之间数据的同步 xff0c 最初使用是一对一的情况 xff0c 其实MQ也有一对多和多对多的情况 xff0c 工作实际也需要一对多 xff0c 写了小demo来试试 Applicat
  • 在Centos系统下git 遇到fatal: HTTP request failed,error: while accessing ;SSL connect error错误

    在Go项目中go get的时候遇到以下错误 src github com lib pq git error while accessing https github com lib pq info refs fatal HTTP reque
  • Gazebo学习笔记(一)

    搭建一个移动车 ctrl 43 m 进入到gazebo编辑界面 ctrl 43 m 进入到gazebo编辑界面 1 搭建一个车底盘 xff0c 选择simple shapes 的box xff0c 点击后在编辑框中释放 2 利用resize
  • ubuntu 安装openssl-devel

    需要安装openssl devel xff0c Github上的说明要用yum工具安装 xff0c 反复安装不上 xff0c 提示没有repos xff08 回购 xff09 xff0c 最后找到了方法 在Ubuntu系统里这是分开的两个
  • 1分钟教会你二进制撩妹(汉)读心术

    近些年来 xff0c 小魔发现 xff0c 对于年轻的男女而言 xff0c 一些传统的节日似乎都变成了情人节或者脱单节 xff0c 就连 光棍节 xff0c 实际上很多人都是抱着节前或者是当天脱单而过的 双11 光棍节 即将来临 xff0c
  • VLAN基础配置及Access接口、Trunk接口、Hybrid接口

    文章说明 xff1a 1 本文使用的软件是eNSP 2 退到下一层用命令quit xff0c 简写q 3 部分命令使用的是简写 和完整命令一样的作用 xff0c 按键盘上的 34 Tab 34 建可自动补全命令 用于查询的命令 xff1a
  • c++pthread多线程消费者问题

    分布式选修课上讲了多线程编程 xff0c 布置了一个生产者消费者的作业 xff0c 觉得挺有意思 xff0c 并且网络上的消费者问题多使用c语言编写 xff0c 故在此记录c 43 43 解决方法 由于是消费者线程各自计数 xff0c 故使
  • 红包动画

    lt DOCTYPE html gt lt html lang 61 34 en 34 data dpr 61 34 1 34 style 61 34 font size 32px 34 gt lt head gt lt meta char
  • Android中<xliff:g></xliff:g>的用法

    在查阅修改Android源码的过程中经常能在字符串资源中看到类似下面的标签 xff1a span class hljs tag lt span class hljs title resources span span class hljs
  • vue单文件组件的格式规范

    lt template gt lt template gt lt script gt export default name 39 39 mixins components props data return computed watch
  • Linux命令行安装weblogic12c

    Linux命令行安装weblogic12c 一 安装jdk 若已安装可跳过 1 Oracle官网下载jdk linux安装包 2 卸载linux系统中自带的jdk 使用rpm qa grep java查询出系统自带的jdk xff1b 使用
  • Ubuntu 远程免密码登录设置

    我们正常使用 ssh 远程登录服务器进行操作 xff0c 需要输入用户名 服务器ip以及密码 xff0c 当我们需要同时管理多个服务器的时候 xff0c 每次都需要重复输入这些东西会显得特别麻烦和浪费时间 xff0c 因此我们可以通过配置密
  • Mybatis resultMap启动时报错:Could not resolve type alias userResultMap Cannot find class: userResultMap

    MyBatis中在查询进行select映射的时候 xff0c 返回类型可以用resultType xff0c 也可以用resultMap xff0c resultType是直接 表示返回类型的 xff0c 而resultMap则是对外部Re
  • synchronized-锁总结

    目录 一 相关知识点 1 1 对象头 1 2 锁相关概念 1 3 查看对象头工具 二 锁流程 2 1 加锁 xff1a monitorenter 2 2 释放锁 xff1a monitorexit 一 相关知识点 在 JDK1 6 之前 x
  • 软件工程师校招面试救急包

    LeetCode牛人总结 xff08 手撕代码前看看 xff0c 抱佛脚 xff09 https github com labuladong fucking algorithm blob master README md 剑指offer x

随机推荐

  • 微信SDK中含有的支付功能怎么去掉?

    一 说在前面的话 这两天遇到一个特别让我DT的问题 xff0c 估计大家通过标题就能知道问题了 没错 xff0c 就是在应用中集成了微信SDK后 xff0c 它自动支持了微信分享 登录 收藏 支付等功能 这一点没啥 xff0c TM的关键点
  • Android中图片的镂空效果(不规则图形的镂空)

    一 说在前面的话 我们在做新手引导时 xff0c 经常会遇到凸显某一块功能时需求 xff0c 类似于下图 xff1a 看到这个功能点可能会有点头大 xff0c 不过好在Android为我们提供一个美好的工具 xff1a PorterDuff
  • 利用三层交换机实现VLAN间路由

    原理概述 xff1a VLAN将一个物理的LAN在逻辑上划分成多个广播域 VLAN内的主机间可以直接通信 xff0c 而VLAN间不能直接互通 在现实网络中 xff0c 经常会遇到需要跨VLAN相互访问的情况 xff0c 工程师通常会选择一
  • Failed to resolve attribute at index 6: TypedValue{t=0x2/d=0x7f0400cd a=7 r=0x7f06006e}

    今天在开发时 xff0c 遇到一个程序的Bug xff0c 记录一下 在Dialog中展示一个布局 xff0c 布局中包含了TextView报了下面的错误 xff0c 最开始还以为是颜色设置的问题 xff0c 反复核对了一下颜色设置并没有问
  • TextView的TextColor中使用selector的问题

    在TextView中如果设置选中 点击 获取焦点时 xff0c 文字颜色发生改变时 xff0c 一般我们会通过代码中设置 不过Android给我们提供了一个更简洁的方式 xff0c 就是通过selector去改变 只需要在Res目录下创建一
  • 彻底理解Java中堆和栈的区别

    1 概述 在Java中 xff0c 内存分为两部分 xff0c 一种是堆内存 xff0c 另一种就是栈内存 2 Java中变量在内存中的分配 1 类变量 static修饰的变量 xff1a 在程序加载时系统就为它在堆中开辟了内存 xff0c
  • 深入了解多线程的原理

    说在前面的话 使用多线程的目的 在多个CPU核心下 xff0c 多线程的好处是显而易见的 xff0c 不然多个CPU核心只跑一个线程其他的核心就都浪费了即便不考虑多核心 xff0c 在单核下 xff0c 多线程也是有意义的 xff0c 因为
  • An operation is not implemented: not implemented被坑之路[Kotlin]

    吐槽一下 xff0c 程序猿的辛酸史 今天在开发新项目时 xff0c 首次使用了Kotlin语言 xff0c 对于之前只在纸上谈兵 xff0c 未在项目中使用过的码农 xff0c 很是一脸懵逼 但是迫于公司的要求 xff0c 只能硬头皮冲吧
  • 开发Android Camera—使用Kotlin语言,完成第一个自定义相机

    对于首次使用Kotlin语言开发 xff0c 在网上苦于寻找不到Kotlin语言编写的相机代码 xff0c 故写下这篇博客 好了 xff0c 咱们进入主题 在Android 5 0 xff08 SDK 21 xff09 中 xff0c Go
  • Android ConstraintLayout性能分析

    这篇文件是讲述ConstraintLayout性能的分析 xff0c 如果对于使用ConstraintLayout不是很了解的情况下 xff0c 请查看Android ConstraintLayout完全解析和性能分析 xff08 章节一
  • 针对drawableStart(Top、End、Bottom)边距的设置-Android布局技巧

    作为Android程序猿 xff0c 在开发布局的过程中 xff0c 我们的宗旨是能用一个View完成的效果 xff0c 绝不会用两个View或者嵌套View来完成 至于它的好处 xff0c 就不言而喻了吧 不懂的自行到网上看 xff0c
  • markdown基本语法

    转载自 Cmd 技术渲染的沙箱页面 xff0c 点击此处编写自己的文档 Cmd Markdown 简明语法手册 标签 xff1a Cmd Markdown 1 斜体和粗体 使用 和 表示斜体和粗体 示例 xff1a 这是 斜体 xff0c
  • unix环境高级编程——UNIX体系架构

    本期主题 xff1a unix环境高级编程 UNIX体系架构 文件IO 0 初始UNIX1 系统调用2 库函数2 1 C语言的运行库 3 shell 0 初始UNIX 这里略过unix的历史不讲 xff0c 网上有比较详细的资料 我们可以将
  • HTML基础<1>

    一 图片标签与超链接 lt br gt 是空格 lt hr gt 是横线 lt img src 61 34 34 width 61 34 34 height 61 34 34 gt lt a href 61 34 https www bai
  • Android Lottie动画

    Android Lottie动画 在Android中 xff0c 往往UI会让写一些动画效果 xff0c 比如启动页心形跳动 xff0c 返回效果等 一般我们在项目中常用的动画无非是以下几种 xff1a 普通动画帧动画属性动画通过改变Lay
  • 我与人工智能的故事

    本文作者 xff1a 诸葛越 前 言 人工智能的三次浪潮 2018年年初 xff0c 招聘季正如火如荼地进行 xff0c 而 数据科学家 和 算法工程师 绝对算得上热门职业 人工智能 机器学习 深度学习 建模 卷积神经网络 等关键词 xff
  • GitHub安装和使用

    GitHub安装和使用 GitHub是一个基于git的代码托管平台 xff0c 付费用户可以建私人仓库 xff0c 一般的免费用户只能使用公共仓库 xff0c 也就是代码要公开 Github 由Chris Wanstrath PJ Hyet
  • Linux系统java安装

    1 下载 进入Oracle官网进行JDK下载 2 创建目录 span class token function mkdir span usr java span class token function cd span usr java 3
  • 过年之抢红包算法

    前言 昨天是大年初一 xff0c 怎么说呢 xff0c 因为在读大学 xff0c 没有出来工作 xff0c 所以昨晚也是陆陆续续有收到一些红包 然后想起自己对算法感兴趣 xff0c 以前也看过一些公众号有讲过抢红包算法 xff0c 今天就更
  • DL基本知识(七)FTRL优化器

    契机 最近工作方向为缩减模型规模 xff0c 切入点为L1正则化 xff0c 选择该切入点的理由如下 xff0c 众所周知 xff0c L1正则化能令权重矩阵更稀疏 在推荐系统中特征多为embedding xff0c 权重矩阵稀疏意味着一些