Jiahong的个人博客

凡事预则立不预则废


  • Home

  • Tags

  • Archives

  • Search

Linux——多用户问题

Posted on 2020-06-13

在Linux系统有多个用户时,我们可能需要从一个用户界面打开终端登录另一个用户,从而使用该用户的环境和软件


多用户打开各自软件问题

问题描述

  • 在一个用户登录图形界面后,需要以另一个用户的身份打开一个图形化软件,此时直接打开图形化软件可能遇到如下错误

No protocol specified

问题发生原因

  • 因为Xserver默认情况下禁止别的用户图形程序运行在当前用户图形界面上

解决方案

  • 在当前用户下执行命令
    1
    xhost +

General——深刻认识URL

Posted on 2020-03-06

你真的认识URL了吗?

URL中的#字符

  • #在URL中与服务器无关,也就是说正常访问服务器的URL不包含#
  • #仅仅与本地浏览器对网页的定位相关
  • #由于不影响对远程服务器的访问,自然也不会存在于软件包的下载连接中

URL的正则表达式

参考博客:https://blog.csdn.net/qq_25384945/article/details/81219075

  • Python

    1
    http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+
  • JavaScript

    1
    /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/
  • Java

    1
    ^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]
  • Python

Centos——挖矿病毒kdevtmpfsi查杀经历

Posted on 2020-01-08

挖矿病毒kdevtmpfsi查杀经历

问题简介

  • 服务器: 阿里云主机服务器
  • 系统: Centos7
  • 表现: kdevtmpfsi进程占用400%(8核心处理器)CPU
  • 时间: 2020-01-07报警, 2020-01-08处理

查杀经过

  • 使用clamscan命令搜索所有文件, clamav详情见我之前的博客clamav安装与杀毒

    1
    nohup clamscan / -r --infected -l clamscan.log > clamscan.out &
    • 这一步比较花时间
  • 查看扫描结果

    1
    cat clamscan.log | grep FOUND

/var/lib/docker/overlay/bdd049c71596d743907224a8dd6fdb3fb4ca76e3af8dfd6eee2d034de2be45a1/merged/tmp/kdevtmpfsi: Multios.Coinminer.Miner-6781728-2 FOUND
/var/lib/docker/overlay/bdd049c71596d743907224a8dd6fdb3fb4ca76e3af8dfd6eee2d034de2be45a1/merged/tmp/red2.so: Unix.Trojan.Gafgyt-6981174-0 FOUND
/var/lib/docker/overlay/bdd049c71596d743907224a8dd6fdb3fb4ca76e3af8dfd6eee2d034de2be45a1/upper/tmp/kdevtmpfsi: Multios.Coinminer.Miner-6781728-2 FOUND
/var/lib/docker/overlay/bdd049c71596d743907224a8dd6fdb3fb4ca76e3af8dfd6eee2d034de2be45a1/upper/tmp/red2.so: Unix.Trojan.Gafgyt-6981174-0 FOUND

  • 删除这四个文件,这里直接到相关目录下查看发现../tmp目录下往往都是病毒文件(与kinsing相关,全部删除)

  • top查看CPU信息确定挖矿进程kdevtmpfsi的进程号[pid]

  • 确定启动信息中启动命令,并删除(在这里查到的信息是文件已经被删除了)

    1
    ls /proc/[pid] -ali
  • 查找父进程进程号

    1
    systemctl status [pid]

● docker-be9fcab033e6158f8ff7d6ac07d28cfd918375178c27e016aa800cbeef985161.scope - libcontainer container be9fcab033e6158f8ff7d6ac07d28cfd918375178c27e016aa800cbeef985161
Loaded: loaded (/run/systemd/system/docker-be9fcab033e6158f8ff7d6ac07d28cfd918375178c27e016aa800cbeef985161.scope; static; vendor preset: disabled)
Drop-In: /run/systemd/system/docker-be9fcab033e6158f8ff7d6ac07d28cfd918375178c27e016aa800cbeef985161.scope.d
└─50-BlockIOAccounting.conf, 50-CPUAccounting.conf, 50-DefaultDependencies.conf, 50-Delegate.conf, 50-Description.conf, 50-MemoryAccounting.conf, 50-Slice.conf
Active: active (running) since Mon 2019-11-11 11:24:17 UTC; 1 months 27 days ago
Tasks: 38
Memory: 2.3G
CGroup: /system.slice/docker-be9fcab033e6158f8ff7d6ac07d28cfd918375178c27e016aa800cbeef985161.scope
├─ 4475 redis-server *:6379
├─ 8528 sh -c /tmp/.ICEd-unix/vJhOU
├─ 8529 /tmp/.ICEd-unix/vJhOU
└─22822 /tmp/kdevtmpfsi

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

  • 杀死不需要的相关进程,如上面的4475,8528, 8529, 22822

  • 查看是否还有需要杀死的进程,如果有,则杀死该进程

    1
    ps -ef | grep kinsing
  • top确定挖矿进程已经被杀死

总结

  • 查杀病毒两个小时未发现服务器有明显异常
  • 第二天出现了,需要进一步查看,重启机器后问题没有再出现

CA——WideAndDeep

Posted on 2019-12-28

背景

  • 一般来说,模型最重要的是 Memorization 和 Generalization
    • Memorization: 可以不精确地定义为学习 items 或者特征的频繁共现,并且从历史数据里面开发(exploiting)
    • Generalization: 基于相关性的传递性(transitivity of correlation), 探索发现一些新的特征组合(从我出现或很少出现的组合)

Wide

  • 注重记忆能力
  • 手动特征交叉组合(实现低阶的特征组合)

Deep

  • 泛化能力
  • 高阶特征
  • 低维稠密embedding

Wide and Deep

  • 结合了Wide和Deep两个模型
  • 不是模型的集成(Ensemble),这里称为联合训练(Joint Training)
    • 集成的两个模型是分开独立训练的,然后预测的时候合并了两个模型的预测
    • 联合训练是两个模型同时训练,训练时是加权相加的,每次训练时损失是一起传递

CA——Google-Ad-Click-Prediction

Posted on 2019-12-23
  • 参考文献:Google KDD 2013,Ad Click Prediction: a View from the Trenches(引用量500+)
  • 介绍了截止到2013年之前的点击率预估常用算法
  • 在线优化算法的发展历程:SGD->TG->FOBOS->RDA->FTRL-Proximal

核心贡献

  • 基于传统的逻辑回归算法(Regularized Logistic Regression,正则化的逻辑回归)在点击率预估时的不足,提出一种在线逻辑回归算法,FTRL(Follow The Regularized Leader)
  • per-coordinate learning rate

一些模型的比较和介绍

  • 传统逻辑回归算法中使用OGD(Online Gradient Descent)是非常高效的,使用很小的计算资源就能得到较好的精确度.
  • 但是OGD在生成系数模型方面表现不好(OGD + L1)
  • 其他在稀疏性方面表现良好的方法有FOBOS, 截断梯度(Truncated Gradient)和 RDA(Regularized Dual Averaging)
    • RDA在精确度和稀疏性方面做tradeoff, 效果好于FOBOS
  • FTRL-Proximal号称可以同时获得RDA的稀疏性和OGD的精确度
  • RDA模型是微软提出的一种在线优化算法,与OGD完全不同,能得到更加稀疏的模型,但是精确度不如OGD

FTRL-Proximal Learning (Online Learning And Sparsity)

  • 也是通过L1正则化控制模型的稀疏度

推导过程

FTL(Follow The Leader)的介绍
OGD的更新方式
  • 更新规则:
    $$
    \begin{align}
    \mathbf{w}_{t+1} &= \mathbf{w}_t-\eta_t\mathbf{g}_t
    \end{align}
    $$
FTLR(Follow The Regularized Leader)

加上正则项的FTL

  • 更新规则:
    $$
    \begin{align}
    \mathbf{w}_{t+1} &= \arg\min_{\mathbf{w}}\left ( \mathbf{g}_{1:t}\cdot \mathbf{w} + \frac{1}{2}\sum_{s=1}^t \sigma_s || \mathbf{w} - \mathbf{w}_s||_2^2 + \lambda_1||\mathbf{w}||_1 \right ) \\
    \mathbf{g}_{1:t} &= \sum_{i=1}^t\mathbf{g}_i
    \end{align}
    $$
    • 第一项是对损失函数梯度的贡献的一个估计
    • 第二项是控制参数\(\mathbf{w}\)在每次迭代中变化不要太大
    • 第三项是L1正则化,用于使模型变得稀疏
    • \(\sigma_s\)是学习速率
    • 这个学习速率可以用Per-Coordinate Learning Rate:
      $$
      \begin{align}
      \eta_{t, i} &= \frac{\alpha}{\beta + \sqrt{\sum_{s=1}^t g_{s,i}^2}} \\
      \mathbf{g}_s &= \nabla l_s(\mathbf{w})
      \end{align}
      $$

Per-Coordinate Learning Rates

  • 对参数的每一维度分开训练,每个维度有自己的学习率
  • 某个特征出现的次数越多,说明当前该特征对应的参数值越可信,学习率就应该越小
  • 考虑了数据在每个特征上的分布不均匀性
    • 参数某个维度上的样本数越少,这些样本就会得到越大的利用(具体表现就是该特征的学习率会比较大)

一个思考

  • 问题:为什么机器学习中的学习率都是越来越小?
  • 答案:因为刚开始训练时,参数的值不太可信(也就是说最终参数与当前参数的置信度比较低),所以更新时应该更新的步骤大一些,让当前的参数变化大一些,训练到后来,随着参数的值越来越可信(当前参数的置信度比较高),更新的步骤就应该小一些,让当前的变化小一些

一些工程上的Trick

Saving Memory at Massive Scale

Probabilistic Feature Inclusion
  • 在高维数据中,大量的特征是出现频率非常低的(rare),半数的唯一特征甚至只出现一次
  • 统计这些特征的代价是非常昂贵的,有些特征可能永远不会被实际使用(这里如何理解昂贵?也就是说训练了也没用?)
  • 额外的读写数据是昂贵的,如果能丢弃一部分出现评论特别低的特征(比如出现频率低于k次)
  • 实现稀疏可以使用L1正则化,也可以使用Probabilistic Feature Inclusion
  • 关于Probabilistic Feature Inclusion的做法
    • 当一个特征第一次出现时,以一定的概率接受这个新特征
    • 效果作用于数据预处理阶段,但是可以在在线执行中设置
Possion Inclusion
  • 对于新的特征,以概率p添加入模型
  • 对于已经存在模型中的特征,正常更新其系数
Bloom Filter Inclusion
  • 用布隆过滤器仅仅保留出现次数在n次以上的特征
Encoding Values with Fewer Bits
  • 常用的OGD使用32或者64位浮点数编码来存储模型的系数
  • Google提出可以使用16位浮点数来存储系数,同时加上一些策略
  • 实验结果:将64位的浮点值换为为系数存储节省了75%的RAM内存空间(这还用实验?直接计算就得到了啊)
Training Many Similar Models
  • 同时训练多个模型是超参数选择常用的方法
  • 将可以共享的东西共享
  • 在节省内存的同时,还可以节约网络带宽(存储一份Per-coordinate学习率,节省内存和带宽等),CPU(用同一个hash表检索特征,节省CPU)和硬盘空间
A Single Value Structure
  • 有时候我们希望评估大量的模型在只有少量的特征组(groups of features)添加或者删除时的变化
  • 对于每一维度(coordinate),仅仅存储一个系数值而不是多个(正常应该为每个模型存储一个)
  • 存储该维度对应特征组的模型共享该系数
  • 对每个特征,训练时每个模型都会计算自己的值,然后所有模型的取平均作为所有包含该维度特征模型的共享
Computing Learning Rates with Counts
  • 对于每个特征来说,梯度和以及梯度平方和是必须计算的
  • 梯度的计算必须准确,但是计算学习率却是可以粗糙计算的
  • 仅仅统计样本出现次数(Counts)就能大概计算学习率
推导
  • 假设包含一个给定特征的所有事件(events)具有有相同的概率(一般来说,这个近似是不可能的,但是在这个目标里面是可行的)
    • 如何理解这个假设的意义呢?对于具有某个特征的所有样本,其取值为(正负例)是的概率是相等的,正例(click)概率都为\(p\)
  • 进一步假设模型已经精确地学习到了概率
  • 如果有分别有\(P,N\)个正负样本(events),则有\(p=\frac{P}{N+P}\)
  • 则有对于逻辑回归(\(p(1-p)\))来说,正例的梯度为\(p-1\),负例的梯度为\(p\)
    $$
    \begin{align}
    \sum g_{t,i}^2 &= \sum_{positive \ events}(1-p_t)^2 + \sum_{negative \ events}p_t^2 \\
    &\approx P(1-\frac{P}{N+P})^2 + N(\frac{P}{N+P})^2 \\
    &= \frac{PN}{N+P}
    \end{align}
    $$
  • 也就是说,为了近似计算\(\sum g_{t,i}^2\),我们仅需要记录\(P,N\)即可
Subsampling Traning Data
  • 典型的CTRs是远远低于50%,数据偏差很大,正例(点击)的样本很稀疏
  • 在模型训练中正例样本相对而言更有价值
  • 使用下采样:很大程度上降低数据量,同时保证对精度最小程度的影响
采样方法:
  • 保留所有至少被点击过一次的请求(Query,也就是样本)
  • 以一定比例\(r\in(0, 1]\)采样没有被点击过的请求
  • 因为包含通用的特征(Feature Phase)计算,所以这种方法是合理的,但是需要纠偏(直接用采样后的样本训练会造成预测偏差)
  • 加入一个重要性权重\(w_t\)
    • \(w_t = 1\) for clicked queries
    • \(w_t = \frac{1}{r}\) for queries with no clicks
    • 本质上可以理解为这里是将采样时造成的负例比例偏差补齐

模型性能评估

Progressive Validation

  • Progressive验证又称为在线损失(online loss)
  • 与交叉验证(cross-validation)或留出法(hold out)验证是不同的
  • 在服务查询中,在线损失能很好的代表我们的精度,因为在训练模型前,它仅仅在最新数据上评估其性能(因为这准确的模拟了当模型进行服务查询时发生了什么)
  • 由于用了100%的数据作为训练和测试,在线损失比留出法验证有更好的统计数据
  • 绝对指标往往会带来误导
    • 即使预测是完美的,对数损失和其他指标的差异也依赖着问题的困难程度
    • 不同的国家,不同请求的点击率不同(同为对数损失的最佳实践,50%的点击率会好于2%的点击率)
  • 所以使用相对变化,看指标相对于base line改变了多少
  • 从经验来看,相对指标在整个时间段内都很稳定
  • 相同的指标计算应该对应在完全相同的数据(比如不同时段的损失比较是没有意义的)

置信度评估(Confidence Estimates)

  • 对很多应用来说,除了评估广告的CTR,还要量化预测的期望精确度(the expected accuracy of the prediction)

校正预测(Calibrating Predictions)

  • 系统偏差(Systematic Bias)指平均预测CTR(Average Predicted CTR)和观测CTR(Observed CTR)的差异
  • 造成系统偏差的原因包括:
    • 不精确的模型假设
    • 学习算法的缺陷
    • 在训练或者服务(预测)时不可用的隐藏特征
  • 解决方案:
    • 添加一个校正层将预测CTRs与观测CTR做匹配(match predicted CTRSs to observed click-through rates)
    • 暂时不能提供有效的保证,保证校正影响的有效
    • 校正的本质是找到(拟合)一个函数映射\(g\),使得模型输出值与真实概率值一一对应
    • 逻辑回归中的sigmoid函数可以看做是一个校正预测的函数吗?
  • 更多参考
    • 风险模型 - 概率校准
    • 机器学习:概率校准, 文中有代码示例
    • 概率校准 Probability Calibration

一些说明

参考博客:https://blog.csdn.net/fzcoolbaby/article/details/99174601?utm_source=distribute.pc_relevant.none-task

  • 概率模型的搭建过程中,由于抽样与正则化等原因,导致模型的输出概率值明显偏离真实概率值
    • [待更新:为什么抽样和正则化会影响模型的输出概率发生变化?]
  • 此时的模型输出概率值仅仅有排序的意义,其绝对值没有意义(定序值,而非定距数值)
  • 校正预测的过程就是把模型输出概率值的校正成真实的概率的过程,使得校正后的概率有绝对值意义

自动特征管理(Automated Feature Management)

  • 将特征空间描绘成上下文和语义信号,每个信号都可以被翻译成一个在学习时有真实值的特征集合
  • [待更新]

一些不成功的实验记录(Unsuccessful Experiments)

本节记录google的一些失败的尝试方向(有些可能会让人很惊讶),这些方向模型没有明显收益

Aggressive Feature Hashing

关于特征哈希(Feature Hashing)的相关知识可参考Feature-Hashing

  • Feature Hashing for Large Scale Multitask Learning论文指出,Feature Hashing方法效果显著
    • 报告显示使用特征hashing技巧,可以能将学习一个垃圾邮件过滤模型的特征空间映射成包含\(2^24\)个特征的特征空间(疑问:这里的特征原来不止\(2^24\)个吗?)
  • 但是实验证明,使用 Feature Hashing 方法并不能提升我们的方法,所以建议保留 interpretable(non-hashed)的特征向量

Dropout

  • Google用网格搜索的方法测试了从0.1到0.5的Dropout特征丢弃概率
  • 所有情况均没有带来任何收益(包括精度指标和泛化能力),还往往给模型带来损害(detriment)
  • Google给出的一个解释是:Dropout在图像领域取得较好收益的原因是因为图像领域的数据特征分布与计算广告领域不同
    • 图像领域:稠密特征,此时Dropout把结果(effect)从强相关的特征中分离开来,从而得到泛化效果更好的分类器
    • 计算广告:稀疏特征,且有噪音

Feature Bagging

  • 对特征进行overlapping采样(注意,样本Bagging和特征Bagging不同),然后训练多个独立的模型,最后取平均值
  • 实验证明模型的的AucLoss降低了0.1%-0.6%

Feature Vector Normalization

  • \(\mathbf{x} = \frac{\mathbf{x}}{||\mathbf{x}||}\)
  • 开始有一点精度上的收益,但是后面也出现了一定程度的detriment
  • Google的解释是可能是由于per-coordinate learning rates和正则化的影响

Hexo——Next主题搜索窗口无法弹出

Posted on 2019-12-20
  • 参考博客: https://www.sqlsec.com/2017/12/hexosearch.html

问题描述

  • 有时候会遇到在Mac上Next主题窗口无法弹出的问题
  • 问题分为两类
    • 一类为找不到 search.xml 文件:加载 search.xml 时错误为404
    • 另一类为文章中有特殊字符:加载 search.xml 检查时错误为304

解决方案

404类

  • 修改最外层配置文件./_config.yml,添加以下语句(实测这一步非必须)

    1
    2
    3
    4
    5
    search:
    path: search.xml
    field: post
    format: html
    limit: 10000
  • 安装搜索插件

    1
    npm install hexo-generator-searchdb --save

304类

  • 304状态说明是加载文件存在,但是无法正常解析文件
  • 直接用浏览器访问 search.xml 文件链接,然后查看文件解析异常出现在哪个地方,然后删除特殊字符即可
    • 个人理解,从哪个文件不能搜索,特殊字符就出现在哪个文件中
    • 说明:目前还没遇到过这种情况,后面遇到会再补充

CA——Feature-Hashing

Posted on 2019-12-08
  • 参考文献: Feature Hashing for Large Scale Multitask Learning
  • 特征哈希(Feature Hashing)常用于数据特征降维,同时尽量保留原始特征的表达能力

论文贡献

  • 给出了一种高维数据降维方法,特征哈希(Feature Hashing)
  • 严格证明了特征哈希的可用性

背景

  • 一种构造组合特征的方法是笛卡尔乘积
  • 计算广告领域往往有数十亿的高维特征
  • 一种表达方式是使用词表法,对每个特征从词表里面进行查询
    • 缺陷一:拓展问题,每次拓展词表时难度较大(难以进行模型升级,因为特征维度在变化)
    • 缺陷二:无法处理词表中不存在的特征(Unknown特征)
  • 一般的降维方法容易带来特征表达能力的损失

特征哈希

  • 哈希函数定义(参考自博客:https://blog.csdn.net/qjf42/article/details/82387559)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def feature_hashing(features, m):
    """
    Args:
    features: 输入特征序列,可以是数字,字符串(本质还是数字)
    m: 输出的特征维度,通常是2**26(vw),2**20(scikit-learn)
    Returns:
    m维的(稀疏)向量
    """
    # 这里的x一般是稀疏表示的(如:scipy.sparse.csr_matrix),这里是为了方便说明
    x = np.zeros(m)
    for feature in features:
    # hash_func_1保证散列尽量平均且散列速度快
    idx = hash_func_1(feature) % m
    # 这里在原始论文中
    sign = hash_func_2(feature) % 2
    if sign == 1:
    x[idx] += 1
    else:
    x[idx] -= 1
    return x
    • 输出特征维度一般为\(m = 2^24\)等,是一个认为给定的数字
  • 与词表法比较:

    • 解决了模型升级时的特征拓展问题(增加新特征时,特征的维度不会变化)
    • 解决了Unknown特征问题(个人理解:因为hash函数不管是什么特征,都可以一视同仁)
    • 无需查表,节省了查表的时间(个人理解:其实查表时一般实现方式也是用哈希表构建索引,所以这里不能算是优势)
    • 完成了降维(这里是把字典法里面对邮件或者文档的id也算作一个特征,这个特征one hot表示一下将会造成数据维度变得非常大?但是id算做特征有什么意义吗?)

一些说明

  • 冲突总会发生,也就是说不同一个特征总有一定的概率被映射到同一个维度(即两个不同特征的idx值可能相等)上
  • Paper中的垃圾邮件过滤模型实验证明:冲突造成的损失漏召率在\(m=2^22\)时影响约为1%,接近不做hash时的效果(特征维度在不做hash约为\(2^{25}\))且在\(m=2^{18}\)时为1.12%,也只升高了一点点
  • 另外:无论如何,总有特殊情况,比如重要的特征如用户的性别特征“男”和“女”二者可能被映射到同一个维度上
    • 这里编码时是男:(1, 0), 女(0, 1)这样的,所以如果二者映射到同一个维度上,那么这两个特征丢失了原本的表达能力
    • 真实环境中如果遇到这些问题将会很难调试,如果找到了相关的问题,可以通过修改映射函数的输入参数字符串等方式来错开两个特征
  • 特征哈希本身可以类比于机器学习中的核技巧,所以特征哈希也称为哈希技巧

一些理解

知乎用户

  • 参考Ainika Peng的博客:https://www.zhihu.com/question/264165760/answer/279676705
  • 一般而言这类技术是为了解决两个问题:
    • 一是将categorical的特征编码为模型可理解的格式, 这是个基础问题。One-Hot Serializing就可以达到这个效果,例如将训练样本中出现过的的每个deviceid按顺序递增编号(比如deviceid@xxx:1 -> feature@10000:1)。
      • 缺点1:这个映射表需要传递给引擎端,在prediction的时候照着再查一遍,数据量大且数据结构设计不好的时候很费时间;
      • 缺点2:有些频次很低的特征置信度不高,单独出现对模型无益(甚至over-fitting)。这时候可以使用按频次截断技术进行降维。比如微软在deep crossing中提到的特征工程方法:只保留曝光最多的10k个campaign id编码为0-9999,其余的id全部编码为10000,但辅以poCTR等连续特征作为辅助。事实上这是一种手工的Hashing方法。
    • 二是尽可能在保留有效信息的基础上降低训练和预测过程的时间复杂度
  • 自动Hashing方法的好处是:
    • 只要训练和预测时使用的hashing方法一致,对同一个特征的编码结果即一致,因此引擎预测或提供数据dump的时候无需查找编码表。所以其最大优点在于数据一致性和速度提升,这在极大规模特征和在线学习中至关重要。
  • 我们说的Hashing算法一般而言均特意设计为低碰撞率。
    • 因此一般hashing算法本身不会大幅降低特征维度,自然也不会大幅损失特征信息。真正可能存在问题的是hashing之后的降维过程。
    • 一个非常常见的陷阱是string哈希到int64后取模m,试图将特征压缩至m维one-hot空间。在这种情况下,对于不知情的随机hashing过程,不同特征的碰撞率为1/m。举个例子,对于“性别”特征,将male哈希为一个int64,female哈希为另一个int64,很难发生碰撞;但如果你试图使用mod2将其压缩,如果你的算法哈希出的这两个int64奇偶性相同,则会导致特征失效。在你有很多feature需要哈希而又不清楚hashing算法细节的情况下,这在概率意义上是很容易发生的。
      • 这里的mod2是极端举例,其实m的取值小于原始维度的情况下都有一定概率造成冲突
  • 因此我们会更倾向于所谓的embedding算法
    • 例如将70万维的userid通过weight embedding到32维的连续值特征上(不同于传统hashing的低维离散值特征)。这意味着训练过程更加复杂(有更多的weight需要optimize);但对于预测过程,其特征性能十分良好且时间复杂度得以降低。同时,由于连续值特征空间的表达能力大幅高于离散值特征空间,整个模型的表达能力并不会明显下降,也基本不会发生离散hashing的碰撞问题。
    • 当然,如果是FM这类倾向于接受离散值的模型,手工serializing+精心设计的hashing是较好的选择。
  • 优点:
    • 训练和预测的时间复杂度大幅降低;
    • 数据的一致性强,不存在同一个特征今天编码成这个、明天编码成那个的情况,便于跟踪单特征效果;
    • 对new feature可以直接编码并加入训练,无需等待编码表统计并反馈;
    • 降低feature space大小,(精心设计可以)降低over-fitting的几率。
  • 缺点
    • 在不清楚hashing function细节的情况下,容易导致特征碰撞失效,且难以排查;
    • 难以通过hashing出的特征反推源特征;
    • embedding会降低模型的可解释性。

General——各种包的管理总结

Posted on 2019-11-09

编程语言相关

  • 参考链接: https://help.github.com/en/github/managing-packages-with-github-packages/about-github-packages#supported-clients-and-formats
Package client Language Package format Description
npm JavaScript package.json Node package manager
gem Ruby Gemfile RubyGems package manager
mvn Java pom.xml Apache Maven project management and comprehension tool
gradle Java build.gradle or build.gradle.kts Gradle build automation tool for Java
docker N/A Dockerfile Docker container management platform
nuget .NET nupkg NuGet package management for .NET
pip Python requirements.txt use pip install -r requirements.txt

操作系统

  • 参考链接: https://www.iteye.com/blog/justcoding-1937171
软件管理方式 线下安装命令 线上安装命令 distribution 操作系统
RPM rpm, rpmbuild yum Red Hat/Fedora
DPKG dpkg apt, apt-get Debian/Ubuntu

rpm和dpkg常用命令总结

  • 参考链接: http://cha.homeip.net/blog/archives/2005/08/rpm_vs_dpkg.html
操作描述 rpm dpkg
安装指定套件 rpm -i pkgfile.rpm dpkg -i pkgfile.deb
显示所有已安装的套件名称 rpm -qa dpkg -l
显示套件包含的所有档案 rpm -ql [softwarename] dpkg -L [softwarename]
显示特定档案所属套件名称 rpm -qf [/path/to/file] dpkg -S [/path/to/file]
显示制定套件是否安装 rpm -q [softwarename] dpkg -l [softwarename], -s或-p显示详细咨询, -l只列出简洁咨询
移除指定套件 rpm -e [softwarename] dpkg -r softwarename, -r 留下套件设定, -P完全移除

apt和yum常用命令总结

  • 参考博客: https://cnblogs.com/lanbosm/p/9130211.html
操作描述 yum apt
软件源配置文件路径 /etc/yum.conf /etc/apt/sources.list
安装软件包 yum install [package] apt-get install [package]
删除软件包 yum uninstall [package] apt-get remove [package]
删除有依赖关系的软件包和配置文件 yum uninstall [package] apt-get autoremove [package] –purge
查看安装包信息 yum info [package] apt-cache show [package]
更新软件包列表 yum update apt-get update
清空缓存 yum clean apt-get clean
搜索包名 yum apt-cahce search

一些特殊命令

apt

  • 列出所有可用包名

    1
    apt-cache pkgnames
  • 通过描述列出包名

    1
    apt-cache search [keys]
  • 指定包的版本号

    1
    apt-get install [package]=[version]

yum

  • 搜索包的可用版本

    1
    yum --showduplicates list [package] | expand
    • expand命令用于将文件的制表符tab转换成空格符space
      • 默认一个tab对应8个space
      • 若不指定文件名(或者文件名为-), 则expand会从标准输入读取数据
    • unexpand命令与expand相反
  • 安装时指定包的版本号

    1
    yum install [package]-[version]

yum和apt安装的常用参数

  • -y: 指定在询问是否安装时均选择yes
  • -q: quiet,安装途中不打印log信息

General——各种压缩方式总结

Posted on 2019-11-09

.tar.gz

.tar.bz2

.tar.xz

.tgz

Centos——clamav安装与杀毒

Posted on 2019-11-03

clam是一款Linux上免费的杀毒软件


安装与配置

命令行安装

命令行安装clamav会自动创建clamav用户和clamav组

  • Centos

  • 在Centos7亲测*

    1
    yum install –y clamav clamav-update
  • ubuntu

  • 在Ubuntu16.04上亲测*

    1
    apt-get install clamav

源码安装

如果因为某些原因无法从命令行安装,可以尝试用源码安装,此时需要首先手动创建相关组和用户

安装前的配置
  • 创建clamav组

    1
    groupadd clamav
  • 创建用户并添加到clamav组

    1
    useradd -g clamav clamav
源码下载和安装
  • 下载

    • 下载链接: http://www.clamav.net/downloads, 因为版本可能会有更新,这里我们直接给出网站下载地址,可以随时查看版本信息
    • 找到软件包下载链接后,使用wget下载即可,比如
      1
      wget http://www.clamav.net/downloads/production/clamav-0.102.0.tar.gz
  • 安装

    • 解压

      1
      tar -xf clamav-0.102.0.tar.gz
    • 切换目录

      1
      cd clamav-0.102.0
    • 安装依赖

      1
      yum/apt install gcc openssl openssl-devel

使用

升级病毒库

  • 升级命令

    • 命令行安装后更新命令

      1
      freshclam
    • 源码安装后更新命令, 也可以建立软连接后直接使用上面的命令行启动

      1
      /usr/local/clamav/bin/freshclam
    • 建立链接指令

      1
      ln -s [source path] [target path]

查找病毒文件

  • 常用命令

    1
    nohup clamscan / -r --infected -l clamscan.log > clamscan.out &
    • -r 指明递归查杀
    • --infected 表示仅仅输出被感染的部分文件, 否则没有被感染的文件会输出文件名: OK这样无用的信息
    • -l 指明日志文件路径
    • / 是查找的目标目录,如果是整个机器查找则使用/
    • 由于查杀病毒需要很长时间,所以建议使用后台进程进行, 如果是远程, 建议使用nohup
    • 由于输出非常多,所以一般我们使用clamscan.out和clamscan.log分别存储输出和日志
  • 列出被感染文件

    1
    cat clamscan.out | grep FOUND
12…20
Joe Zhou

Joe Zhou

世界上只有一种真正的英雄主义,那就是在认清生活真相之后依然热爱生活。 ——罗曼·罗兰

195 posts
38 tags
GitHub E-Mail
© 2024 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4