本文主要是介绍GraphSAIL 贝叶斯公式 epoch batch iteration区别 GD与SGD 一些代码问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 2021.05.25 看论文GraphSAIL
- 2021.05.26 写论文
- 2021.05.27 论文注意点
- 题目
- 摘要
- 本机安装包
- 2021.07.02 论文审稿
- 回顾代码
- 贝叶斯公式
- 2021.07.05
- 函数
- epoch batch iteration
- 2021.07.06
- GD和SGD
- 2021.07.07
- 2021.07.13
- 2021.07.18
- 看论文 随手记
- 英文
- 2021.08.02
平时看论文/学习的时候,总有一些想法/思考,每次随手一记后来就找不到了。因此特意写一个博客作为日常学习记录。
2021.05.25 看论文GraphSAIL
- 论文中的增量学习和我一开始理解的有区别:有新数据进来时,推荐系统必须要更新模型。这个时候不能只管短期偏好,也需要保留长期偏好。所以就有了增量学习:使用新数据更新模型,但不会造成遗忘。(主要目的并不是我想象中为了减少重复运行模型时间的问题)
- 这里的“知识蒸馏”也不是传统的teacher对应复杂的模型,student对应精简的模型;老数据->teacher, 新数据->student;其次,目的也不一样:现有的工作只关注预测或中间激活层的知识提取方法相比,GraphSAIL显式地提取知识,以保留教师模型学习的图形拓扑信息,并将其转移到学生模型。
- 三种蒸馏结构:
- Local structure:为了保留user长期偏好和item长期特征;
具体:① 计算user_embedding*item_embedding(相当于center node * neighbor node),后面简称为dot ②最小化teacher(时刻t-1)和student(时刻t)的dot。
文中说,这样就保留了用户的历史偏好和物品长期特征。(能够理解,因为新的模型和历史模型相似了,当然就保留啦);
缺点:丢失全局位置信息(和其他节点的相对位置) - Global structure:编码位置信息;
原因:①用户间的embedding距离encode用户间的群体偏好。 ② 用户物品间的embedding距离encode用户喜欢哪类产品。
过程: ① 计算anchor embedding:将用户和物品进行K-means聚类,共得到2K个簇(分别代表用户偏好群体+物品类别);簇的embedding平均值作为anchor embedding; ② 建立 probability distribution,可以表示user偏好属于某个群体偏好的概率 & 用户喜欢某一类型物品的概率;方法是计算node embedding和anchor embedding的相似度; ③ 最小化teacher模型和student模型的global structure distributions的KL散度;(global structure distributions:probability distribution的softmax形式,有K个簇哈) - self-embedding:对学习到的user embedding和item embedding进行约束(通过历史数据和新数据)。
方法:对node embedding使用MSE(student和teacher),并且设置一个权重因子控制蒸馏强度(历史记录越丰富,权重越大)
2021.05.26 写论文
- 宗威师兄:第一段背景太长了;第一段:先说空气污染、堵车,然后造成经济损失;措施,流量预测技术;什么好处;
- 论文写作神器
2021.05.27 论文注意点
题目
- 题目除了介词都要大写。
摘要
- 摘要:不要一直重复“traffic flow”;
这个很重要,有人提出了方法,但是仍面临挑战/问题(不是大问题的挑战,是这个方法的问题)
自己方法解决了什么问题,做这个的必要性;解决的问题不能是很泛的问题,要有针对性。(比如不能说得到更好的embedding)
用词要严谨,有逻辑
重点不是用了什么技术,而是解决了什么问题
摘要:大背景,反映xx很重要;xx技术/方法,但有什么问题(however, such models are expensive to train and diffcult to perfprm frequant updates);我们怎么做的(In this work,we propose )能解决什么问题(so that the xxx can be greatly),再多讲几句(we develpe a xxx to address);讲好处(our approach preserves xxx);贡献(We argue that xxxxx; demonstrate its imporvement compared to other xx learning techniques on two public datasets)
本机安装包
- 打开cmd窗口激活环境
conda activate base
- 使用
conda install package
命令安装包 - 如果不行,就使用
pip install -U package
(如果已安装就升级到最新版)
2021.07.02 论文审稿
回顾代码
tf.layers.dense
相当于加一个全连接层,
tf.layers.dense(
inputs,
units, #输出的维度大小
activation=None,
use_bias=True, # 使用bias为True(默认使用)
kernel_initializer=None, ##初始化器
bias_initializer=tf.zeros_initializer(), ##偏置项的初始化器,默认初始化为0
kernel_regularizer=None, ##正则化,可选
bias_regularizer=None, ##偏置项的正则化,可选
activity_regularizer=None, ##输出的正则化函数
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None, ##层的名字
reuse=None ##是否重复使用参数
)
with tf.name_scope(scope)
定义命名空间np.random.choice(a, size=None, replace=True, p=None)
按概率选择元素,从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组;replace:True表示可以取相同数字,False表示不可以取相同数字;数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。ravel(), flatten(), squeeze()
:ravel():如果没有必要,不会产生源数据的副本;flatten():返回源数据的副本;squeeze():只能对维数为1的维度降维np.arange([start, ]stop, [step, ]dtype=None)
:在给定的时间间隔内返回均匀间隔的值。np.random
用法:
np.random.choice(a, size=None, replace=True, p=None)
:从数列a中随机选择size个元素,replace为True表示选出的元素允许重复。p为元素被选中的概率数列np.random.rand(d0, d1, ..., dn)
:产生维度为(d0, d1, …, dn),值属于[0,1)的正太分布np.random.randn(d0, d1, ..., dn)
:产生维度为(d0, d1, …, dn)的标准正太分布。np.random.randint(low, high=None, size=None, dtype='l'))
:产生属于[low,high)的size数量的离散均匀分布np.random.random(size=None)
:返回随机的浮点数,在半开区间 [0.0, 1.0)。
贝叶斯公式
后验概率,被确诊患病不代表一定患病
2021.07.05
函数
split(sep, num)
将一个字符串分隔成多个字符串组成的列表;sep为分隔符,不写sep时,默认表示用 空格,\n,\t 分隔字符串;num为分隔次数,有sep时按sep的值分隔;split(":")[1]
可以获取冒号后面的内容str.join(sequence)
将序列中的元素以指定的字符连接生成一个新的字符串
a = ['1,2,3]
print(" ".join(str(i) for i in a))
>>> 1 2 3
np.eye()
返回一个对角线上全是1,而其他位置全为0的一个二维数组(2D-array)。或者进行one-hot编码
np.eye(3)
>>>array([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])np.eye(5)[[1,3,4]]
>>>array([[0., 1., 0., 0., 0.],[0., 0., 0., 1., 0.],[0., 0., 0., 0., 1.]])
epoch batch iteration
2021.07.06
GD和SGD
总结的不错的博客
SGD是一次用部分数据,计算梯度,然后根据梯度更新参数
GD是一次用全部数据,计算梯度,然后根据梯度更新参数
2021.07.07
argparse.ArgumentParser()
解析命令行参数;程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。pd.merge()
只能用于两个表的拼接,而且通过参数名称也能看出连接方向是左右拼接,一个左表一个右表。scipy.sparse.csr_matrix
构造稀疏矩阵tf.Graph().as_default()
返回一个上下文管理器,这个上下管理器使用这个图作为默认的图os.path.join()
函数:连接两个或更多的路径名组件。如果各组件名首字母不包含’/’,则函数会自动加上;如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃;如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾。python open()
函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写json.loads()
函数是将json格式数据转换为字典tf.nn.embedding_lookup()
就是根据input_ids中的id,寻找embeddings中的第id行。比如input_ids=[1,3,5],则找出embeddings中第1,3,5行,组成一个tensor返回tf.einsum( equation, *inputs)
用简单的方式表示许多常见的多维线性代数数组运算
# Matrix multiplication
einsum('ij,jk->ik', m0, m1) # output[i,k] = sum_j m0[i,j] * m1[j, k]# Dot product
einsum('i,i->', u, v) # output = sum_i u[i]*v[i]# Outer product
einsum('i,j->ij', u, v) # output[i,j] = u[i]*v[j]# Transpose
einsum('ij->ji', m) # output[j,i] = m[i,j]# Trace
einsum('ii', m) # output[j,i] = trace(m) = sum_i m[i, i]# Batch matrix multiplication
einsum('aij,ajk->aik', s, t) # out[a,i,k] = sum_j s[a,i,j] * t[a, j, k]
np.argsort()
将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。也就是说排第一的数字的索引对应的值是最小的。
2021.07.13
astype('category')
DataFrame格式中某一列使用这个函数,代表取出该列和列名。通常与cat.codes.astype(int)
一起使用,表示将那一列转换成int格式(按原始数据大小排序,依次从0开始赋值)。可以用在数据处理中,将user_name映射为user_id。set.add()
给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作round( x [, n] )
方法返回浮点数 x 的四舍五入值join()
方法用于将序列中的元素以指定的字符连接生成一个新的字符串
2021.07.18
print('\033[1;31m' + content + ' \033[0m')
输出字体带颜色
看论文 随手记
- 大规模离散空间;平衡层次聚类树,寻找一条从根节点到叶节点的路径(时间复杂度)
- 交互式推荐系统,及时获得反馈;RL:动态交互+长期计划;环境模拟器:模拟线上环境
- 采样action的时间与商品总数成线性增长关系
英文
- To the best of our knowledge, this is the first work of xx
2021.08.02
- axis=0代表列,axis=1代表行
- 重复运行tensorflow同一段代码,时间越来越长:网上查了一下:每次迭代计算图中增加了新的节点,导致图内节点越来越多,走向奔溃。
① 判断是否有新节点加入:加入:sess.graph.finalize()
,发现报错,表明“有新建节点的操作” ② 加入tf.reset_default_graph()
:清除默认图形堆栈并重置全局默认图形。 发现可行 - 想把list赋值,不要直接 = = =,用
.copy
或者a[:]
这篇关于GraphSAIL 贝叶斯公式 epoch batch iteration区别 GD与SGD 一些代码问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!