Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Numpy——使用笔记


整体说明

  • Numpy 包含很多高效的函数,能够替换普通的循环,实现非常快
  • 比如累加变成向量运算等

批量运算提效

  • 普通用法

    1
    2
    3
    4
    5
    6
    import numpy as np
    a = np.zeros((n, 1))
    b = np.zeros((n, 1))

    for i in range(n):
    b[i] = math.exp(a[i])
  • 高效用法

    1
    2
    3
    import numpy as np
    a = np.zeros((n, 1))
    b = np.exp(a)
  • 相似的还有 log,abs 等函数


广播机制(broadcasting)

  • 当两个向量(numpy的对象)的维度不同时,Python会将维度小的一个拓展(复制)成与维度大的相同,以便于计算
  • 举例
    1
    2
    a = np.zeros((n, 1))
    b = a + 10

广播规则

  • 形式1

    1
    2
    3
    (m,n) [+-*/] (m,1) 
    <===>
    (m,n) [+-*/] (m,n) # 按列复制第二个n次
  • 形式2

    1
    2
    3
    (m,n) [+-*/] (1,n) 
    <===>
    (m,n) [+-*/] (m,n) # 按行复制第二个m次
  • 形式3

    1
    2
    3
    (m,n) [+-*/] r # r为实数,维度为1
    <===>
    (m,n) [+-*/] (m,n) # 复制r m*n 次
  • 形式4

    1
    2
    3
    (m,1) [+-*/] (1,n) 
    <===>
    (m,n) [+-*/] (m,n) # 按行复制第二个m次,并按列复制第一个n次

广播机制需要注意

  • 广播机制使得书写更加美观,代码更加简洁
  • 但广播机制往往会出现用户意想不到的微妙bug, 需要开发者注意

附录:一些笔记

  • axis=i表示第i维计算后将会消失或变化(该维度的size变成1)
  • 多使用 reshape 函数
    • reshape 函数复杂度是常数的(O(1))
    • reshape 函数可确保我们的程序正确,不用随意猜测矩阵的维度

附录:使用 numpy 包为 Python 内置对象提效

  • numpy 包可以直接操作 list 等对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # # 一维数组
    import numpy as np

    arr = np.array([1, 2, 3, 4, 5])
    mean = np.mean(arr)
    print(mean) # 输出:3.0,整数数组计算均值默认返回浮点数(如 int32 数组返回 float64);若指定 dtype=np.int32,结果会向下取整

    # # 二维数组
    arr = np.array([[1, 2, 3],
    [4, 5, 6]])

    # 沿轴0(列方向)计算均值:每列的均值
    mean_axis0 = np.mean(arr, axis=0)
    print(mean_axis0) # 输出:[2.5 3.5 4.5]

    # 沿轴1(行方向)计算均值:每行的均值
    mean_axis1 = np.mean(arr, axis=1)
    print(mean_axis1) # 输出:[2. 5.]

    # 全局均值(展平后)
    mean_all = np.mean(arr)
    print(mean_all) # 输出:3.5
  • 注意事项:

    • 若数组包含 np.nan,np.mean 会返回 nan,需用 np.nanmean 忽略缺失值
    • 对空数组调用 np.mean 会抛出 RuntimeWarning,并返回 nan
  • np.mean 支持多维数组、指定轴计算,且效率远高于 Python 内置的 statistics.mean(statistics 是 Python 内置库)

DL——PPNet-and-PEPNet

  • 参考链接:
    • 原始论文:PEPNet: Parameter and Embedding Personalized Network for Infusing with Personalized Prior Information
    • PPNET参考链接:推荐模型简介之快手PPENT - Shard Zhang的文章 - 知乎
    • 千人千模 | PEPNet: 2023快手多任务多场景建模 - 蘑菇先生的文章 - 知乎

LHUC

  • LHUC(Learning Hidden Unit Contributions),最早应用于语音识别中
  • LHUC的基本思路是在语音识别中,用一个网络建模说话者的特点,这个网络输出用于修改主网络上的隐藏向量,其模型结构见下图(参考自PPNET参考链接:推荐模型简介之快手PPENT - Shard Zhang的文章 - 知乎):

PPNet

  • 快手2019年将LHUC的思想使用到推荐系统中,并将该方法命名为PPNet(Parameter Personalized Net),据说2019年全量后取得了很不错的收益
  • 推荐系统中的一般的LHUC结构图(参考自PPNET参考链接:推荐模型简介之快手PPENT - Shard Zhang的文章 - 知乎):
  • 快手的PPNet结构图如下:

    如上图3所示,PPNet的左侧是目前常见的DNN网络结构,由稀疏特征(sparse features)、嵌入层(embedding layer)、多神经网络层(neural layer)组成
    右侧是PPNet特有的模块,包括Gate NN 和 只给Gate NN作为输入的id特征。其中uid,pid,aid分别表示user id,photo id,author id。即bias embedding
    左侧的所有特征的embedding会同这3个id特征(uid,pid,aid)的embedding拼接到一起作为所有Gate NN的输入。需要注意的是,左侧所有特征的embedding并不接受Gate NN的反传梯度,这样操作的目的是减少Gate NN对现有特征embedding收敛产生的影响。Gate NN的数量同左侧神经网络的层数一致,其输出同每一层神经网络的输入做element-wise product来做用户的个性化偏置
    Gate NN是一个2层神经网络,其中第二层网络的激活函数是 2 * sigmoid,目的是约束其输出的每一项在[0, 2]范围内,并且默认值为1。当Gate NN输出是默认值时,PPNet同左侧部分网络是等价的
    经实验对比,通过Gate NN为神经网络层输入增加个性化偏置项,可以显著提升模型的目标预估能力。PPNet通过Gate NN来支持DNN网络参数的个性化能力,来提升目标的预估能力,理论上来讲,可以用到所有基于DNN模型的预估场景,如个性化推荐,广告,基于DNN的强化学习场景等

  • 快手PPNet实现的几个核心点:
    • 输入Gate NN的特征是包含了所有特征的,包括左边主塔的输入特征和用户ID特征等
    • Gate NN的梯度不影响左侧的embedding特征(embedding不接受Gate NN的反向梯度)
      • 问题:左边的MLP是否接受来自Gate NN的梯度呢?
      • 回答:从论文PEPNet: Parameter and Embedding Personalized Network for Infusing with Personalized Prior Information中看是可以接受的,当然真实场景中,训练时可以尝试测一下不同方案

PEPNet

  • PEPNet(Parameter and Embedding Personalized Network),包含EPNet和PPNet两个核心逻辑:
    • EPNet(Embedding Personlized Network):主要用于做不同场景(domain)的个性化
    • PPNet(Parameter Personlized Network):做用户维度的个性化,详情见上文
  • 详细框架图如下:
    • 特点:多场景、多任务、千人千模
1…246247248…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4