注意力FM模型AFM

1. 概述

在CTR预估任务中,对模型特征的探索是一个重要的分支方向,尤其是特征的交叉,从早起的线性模型Logistic Regression开始,研究者在其中加入了人工的交叉特征,对最终的预估效果起到了正向的效果,但是人工的方式毕竟需要大量的人力,能否自动挖掘出特征的交叉成了研究的重要方向,随着Factorization Machines[1]的提出,模型能够自动处理二阶的特征交叉,极大减轻了人工交叉的工作量。

但是在FM中,每一个交叉特征的权重是一致的,但是在实际的工作中,不同的交叉特征应该具备不同的权重,尤其是较少使用到的权重,对于统一的权重会影响到模型的最终效果。AFM(Attentional Factorization Machines)[2]模型在FM模型的基础上,引入了Attention机制,通过Attention的网络对FM模型中的交叉特征赋予不同的权重。

2. 算法原理

2.1. FM模型中的交叉特征

FM模型中包含了两个部分,一部分是线性部分,另一部分是二阶的交叉部分,其表达式如下所示:

\begin{matrix}\hat{y}_{FM}\left ( \mathbf{x} \right )= & \underbrace{w_0+\sum_{i=1}^{n}w_ix_i} & + & \underbrace{\sum_{i=1}^{n}\sum_{j=i+1}^{n}\hat{w}_{ij}x_ix_j} \\ & \textrm{linear\;regression} & & \textrm{pair-wise\;feature omteractions} \\\end{matrix}

其中,\hat{w}_{ij} 表示的是交叉特征x_ix_j 的权重,在FM算法中,为了方便计算,为每一个特征赋予了一个k 维的向量:\mathbf{v}_i\in \mathbb{R}^k ,则\hat{w}_{ij} 可以表示为:

\hat{w}_{ij}=\mathbf{v}_i^T\mathbf{v}_j

对于具体为甚么上述的这样的计算方式可以方便计算,可以参见参考[3]。既然上面说\hat{w}_{ij} 表示的是交叉特征x_ix_j 的权重,那么为什么还说在FM模型中的每个交叉特征的权重是一致的,这个怎么理解?如果将FM模型放入到神经网络的框架下,FM模型的结构可以由下图表示:

对于每一个特征都赋予一个$k$维的向量,如上图中的第二个特征x_2k 维向量为\mathbf{v}_2 ,同理,第四个特征x_4k 维向量为\mathbf{v}_4 ,这里类似于对原始特征的Embedding,最终x_2x_4 的交叉特征可以表示为:\left ( \mathbf{v}_2\odot \mathbf{v}_4 \right )x_2x_4 ,其中,\odot 表示的是元素的乘积。最终,将所有的交叉特征相加便得到了交叉部分y_2

y_2= \mathbf{p}^T\sum_{\left ( i,j \right )\in \mathfrak{R}_x}\left ( \mathbf{v}_i\odot \mathbf{v}_i \right )x_ix_j+b

其中,\mathfrak{R}_x=\left\{\left ( i,j \right ) \right\}_{i\in \chi ,j\in \chi,j>i}\mathbf{p}\in \mathbb{R}^kb\in \mathbb{R} ,在上述的FM中,\mathbf{p}=\mathbf{1}b=0 。在相加的过程中,对于每一部分的交叉特征的权重都是一致的,这就会导致上面说的统一的权重会影响到模型的最终效果。我们希望对于每一部分的交叉特征能够有不同的权重,即:

y_2=\mathbf{p}^T\sum_{\left ( i,j \right )\in \mathfrak{R}_x}a_{i,j}\left ( \mathbf{v}_i\odot \mathbf{v}_i \right )x_ix_j+b

其中,a_{i,j} 表示的是第ij 交叉特征部分的权重。

2.2. AFM的网络结构

在注意力FM模型AFM(Attentional Factorization Machines)中,是在FM的基础上引入了Attention机制,通过Attention网络学习到每个交叉特征的权重a_{i,j} ,AFM的网络结构如下图所示:

上述在Pair-wise Interaction Layer和Prediction Score之间的SUM Pooling上增加了Attention的网络,具体的数学表达式如下所示:

\hat{y}_{AFM}\left ( \mathbf{x} \right )=w_0+\sum_{i=1}^{n}w_ix_i+\mathbf{p}^T\sum_{i=1}^{n}\sum_{j=i+1}^{n}a_{ij}\left ( \mathbf{v}_i\odot \mathbf{v}_j \right )x_ix_j

2.3. Attention网络

对于Attention网络部分,需要计算出对于不同的交叉特征部分的权重a_{ij} ,其中,网络的输入为\left ( \mathbf{v}_i\odot \mathbf{v}_j \right )x_ix_ja_{ij} 的计算过程如下:

\begin{matrix}a^{'}_{ij}=\mathbf{h}^TReLU\left ( \mathbf{W}\left ( \mathbf{v}_i\odot \mathbf{v}_j \right )x_ix_j+\mathbf{b} \right ) \\a_{ij}=\frac{exp\left ( a^{'}_{ij} \right )}{\sum_{\left ( i,j \right )\in \mathfrak{R}_x}exp\left ( a^{'}_{ij} \right )}\end{matrix}

参考[4]中给出了具体的AFM的实现,下面是Attention网络的具体实现方法:

def call(self, inputs, training=None, **kwargs):
	if K.ndim(inputs[0]) != 3:
		raise ValueError(
			"Unexpected inputs dimensions %d, expect to be 3 dimensions" % (K.ndim(inputs)))

	embeds_vec_list = inputs # 交叉特征部分
	row = []
	col = []

	for r, c in itertools.combinations(embeds_vec_list, 2):
		row.append(r)
		col.append(c)

	p = tf.concat(row, axis=1)
	q = tf.concat(col, axis=1)
	inner_product = p * q

	bi_interaction = inner_product
	attention_temp = tf.nn.relu(tf.nn.bias_add(tf.tensordot(
		bi_interaction, self.attention_W, axes=(-1, 0)), self.attention_b)) # 计算网络输出,上述公式的第一部分
	#  Dense(self.attention_factor,'relu',kernel_regularizer=l2(self.l2_reg_w))(bi_interaction)
	self.normalized_att_score = softmax(tf.tensordot(
		attention_temp, self.projection_h, axes=(-1, 0)), dim=1) # 归一化,上述公式的第二部分
	attention_output = reduce_sum(
		self.normalized_att_score * bi_interaction, axis=1) # 加权求和

	attention_output = self.dropout(attention_output, training=training)  # training,防止过拟合

	afm_out = self.tensordot([attention_output, self.projection_p]) # 乘以向量,做最终的输出
	return afm_out

3. 总结

AFM模型在FM模型的基础上,引入了Attention机制,通过Attention的网络对FM模型中的交叉特征赋予不同的权重。

参考文献

[1] Rendle S. Factorization machines[C]//2010 IEEE International conference on data mining. IEEE, 2010: 995-1000.

[2] Xiao J, Ye H, He X, et al. Attentional factorization machines: Learning the weight of feature interactions via attention networks[J]. arXiv preprint arXiv:1708.04617, 2017.

[3] 简单易学的机器学习算法——因子分解机(Factorization Machine)

[4] DeepCTR

本文转载于网络 如有侵权请联系删除

相关文章

  • 合并所有文件内容到指定文件

    申请软著或知识产权用的。主要统计代码行数和合并所有代码文件到一个文件,打印前后各30页这个需要自己打开合并后的文件去打印。<?php $output='print.txt'; $dir='app'; $list=scanFiles('app'); $info=mergeFiles($output,$list); echo'文件总数:'.count($list).'个'.PHP_EOL; echo'代码总量:'.$info['contentlength'].'字'.PHP_EOL; echo'代码行数:'.$info['linetotal'].'行'.PHP_EOL; /** *扫描指定目录下的所有文件 *@paramstring$path要扫描的目录 *@paramstring$regex文件名规则(正则) *@returnarray */ function

  • 数值分析第一次实习题报告

    clear; x=linspace(-5,5,10); y=1./(1+x.*x); t=linspace(-5,5,500); Y=1./(1+t.^(2)); xx=linspace(-5,5,10); y1=interp1(x,y,xx,'linear'); plot(x,y,'ro',t,Y,'g',xx,y1,'b');grid;复制clear; clc; x1=[0.20.40.60.81.0]; y1=[0.980.920.810.640.38]; n=length(y1); c=y1(:); forj=2:n%求差商 fori=n:-1:j c(i)=(c(i)-c(i-1))/(x1(i)-x1(i-j+1)); end end symsxdfd; df(1)=1;d(1)=y1(1); fori=2:n%求牛顿差值多项式 df(i)=df(i-1)*(x-x1(i-1)); d(i)=c(i)*df(i); end disp('4次牛顿插值多项式'); P4=vpa(

  • tensorflow学习笔记(八):dropout

    我们都知道dropout对于防止过拟合效果不错 dropout一般用在全连接的部分,卷积部分一般不会用到dropout,输出曾也不会使用dropout,适用范围[输入,输出)tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None)tf.nn.rnn_cell.DropoutWrapper(rnn_cell,input_keep_prob=1.0,output_keep_prob=1.0)普通dropoutdefdropout(x,keep_prob,noise_shape=None,seed=None,name=None) #x:输入 #keep_prob:名字代表的意思,keep_prob参数可以为tensor,意味着,训练时候feed为0.5,测试时候feed为1.0就OK。 #return:包装了dropout的x。训练的时候用,test的时候就不需要dropout了 #例: w=tf.get_variable("w1",shape=[size,out_size]) x=tf.placeho

  • 掌握这5条秘诀,年底工作效率翻倍!

    大格是隔壁公司的,我和她是老乡,边吃饭边八卦是我们的日常。 她说她们公司行政是最神(lao)秘(lei)的岗位,因为没人能坚持过两个月。里面有个行政妹子叫小白,每次见到她都是愁眉苦脸,手里抱着一堆文件跑的飞快,上次碰到大格还跟她说快年底了事情太多太杂她快保不住她的头发了,时常感到头凉!但是…两个月过去了,她竟然还没有辞职?是人性的扭曲还是道德的沦丧?是的她变了。前段时间看起来还很憔悴的她,最近整个人容光焕发!见到谁都喜笑颜开的问声好,手里还永远有小零食!是年底绩效让她决定奋发图强?还是脱发让她决定放飞自我?都!不!是!这一切都是因为——乐!享!群众OS:W...hat?这@#¥%也可以扯到乐享?那必须的接下来来自行政妹子小白的五条秘诀就tellyou乐享是怎么帮到她的! 01智能行政,真·省事儿!“现在找我问‘十万个为什么’的人少了好多!”——From小白行政工作确实是需要处理很多琐碎的事情,而使用乐享后可以用K吧建立员工自助平台,在知识库文档里沉淀国内外差旅、采购、打印机传真等指引,都可以直接给到员工们,真的是方便省事!如果流程指引更新,也可以实时的对员工进行推送,第一时间让员工了解

  • mysql_异常_01_Access denied for user 'root'@'192.168.1.13' (using password: YES)

    一、异常现象使用navicatpremuim连接虚拟机mysql数据库时,抛出如下错误:Accessdeniedforuser'root'@'192.168.1.13'(usingpassword:YES)复制二、异常原因 这是因为虽然用户名和密码正确,但是却没有在其他ip地址上访问的权限。需要登录mysql然后修改权限三、异常解决在mysql服务器上使用root进行登录:mysql-uroot-p复制然后执行如下命令:1.GRANTALLPRIVILEGESON*.*TO'myuser'@'%'IDENTIFIEDBY'mypassword'WITHGRANTOPTION; 2.FLUSHPRIVILEGES;复制然后再连接即可成功连接。二、参考资料1.解决mysql"Accessdeniedforuser'root'@'IP地址'"问题2.关于远程访问mysql出现Accessdeniedforuser'root&

  • Linux用户管理

    用户管理添加用户useradd或者adduser。其实adduser是useradd的一个软连接。以useradd为例,其用法为useradd [option] USERNAME[root@compute~]#ll`whichadduser` lrwxrwxrwx.1rootroot75月2614:21/usr/sbin/adduser->useradd复制-u 指定新添加用户的UID,不过根据规定,普通用户的UID必须大于499且不能和已存在的UID重复。[root@compute~]#useradd-u1010user1 [root@compute~]#tail-1/etc/passwd user1:x:1010:1010::/home/user1:/bin/bash复制-g指定新添加用户的基本组,可以使用GID也可以使用组名来为其指明基本组(可以用id命令来查看用户信息)[root@compute~]#useradd-grootuser2 [root@compute~]#iduser2 uid=1011(user2)gid=0(root)组=0(root)复制-G指定新添加

  • Batch Normalization&Dropout浅析

    一.BatchNormalization对于深度神经网络,训练起来有时很难拟合,可以使用更先进的优化算法,例如:SGD+momentum、RMSProp、Adam等算法。另一种策略则是高改变网络的结构,使其更加容易训练。BatchNormalization就是这个思想。为什么要做Normalization? 神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。 机器学习方法在输入数据为0均值和单位方差的不相关特征时效果更好,所以在我们训练网络的时候,可以人为与处理数据,使其满足这样的分布。然而即使我们在输入端处理好数据,经过更深层次的非线性激活后,数据可能不再是不相关的,也不是0均值单位方差了,这样对于后面网络层的拟合就造成了困难。更糟糕的是,在训练过程中,==每个层的特征分布随着每一层的权重更新而改变。==深度神经网络中的特征分布变化会使神网络的训练变得更加困难,为了克服这种问题,在网络中

  • IBM技术专家教你“懒惰”Linux管理员的10个关键技巧

    作者:VallardBenincosa, 来源: https://www.ibm.com/developerworks/cn/linux/l-10sysadtips/好的系统管理员区分在效率上。如果一位高效的系统管理员能在10分钟内完成一件他人需要2个小时才能完成的任务,那么他应该受到奖励(得到更多报酬),因为他为公司节约了时间,而时间就是金钱,不是吗?技巧是为了提高管理效率。虽然本文不打算对所有技巧进行讨论,但是我会介绍“懒惰”管理员所用的10个基本法宝。这些技巧可以节约时间——即使没有因为高效而得到更多的报酬,但至少可以有更多的时间去玩。01卸载无响应的DVD驱动器 网络新手的经历:按下服务器(运行基于Redmond的操作系统)DVD驱动器上的Eject按钮时,它会立即弹出。他然后抱怨说,在大多数企业Linux服务器中,如果在那个目录中运行某个进程,弹出就不会发生。作为一名长期的Linux管理员,我会重启机器。如果我不清楚正在运行什么,以及为何不释放DVD驱动器,我则会弹出磁盘。但这样效率很低。下面介绍如何找到保持DVD驱动器的进程,并轻松弹出DVD驱动器:首先进行模拟。在DVD驱

  • 服务蓝图再思考 | 洞见

    服务蓝图(ServiceBlueprint)是服务设计中重要的实践之一,本文将回到这一实践的本源,重新思考其核心逻辑在新的消费环境中是否需要演进。溯源服务蓝图(ServiceBlueprint)这一名词可追溯1984年1月哈佛商业评论中G.LynnShostack的文章《DesigningServicesThatDeliver》,此文首次将对服务的设计分为以下几个过程:定义流程区分出服务失败点引入时间效能分析盈利模型(一个擦鞋店的服务设计)此外,Shostack还建议了执行这个蓝图的几个要点,其中包括:客户可见和不可见的部分,用可视线(LineofVisibility)进行分隔;强调统一制式的物品(TangibleEvidence)对服务承诺的正向影响,例如航空公司整齐划一的制服、物品或用具;强调人对于整个服务体验的影响。由于欧美国家时薪制度的标准化,标准服务流程中的时间估算,可以计算出一项服务的成本和盈利模型,因此服务蓝图有着强烈的标准化、工业化、系统化、商业化和控制化的基本属性。Shostack在本章的最后也指出,服务蓝图的作用可归纳为:帮助服务提供商节省服务时间、提高服务效率、以

  • 大数据揭秘:AI工程师真的能拿到百万年薪吗?

    近年来,人工智能技术在各行各业中的应用越来越普及,相关专业技术人才也是供不应求,各大公司或是创业公司不惜重金招募AI人才。最近一项统计显示,人工智能相关职位平均年薪达到30万元-60万元,从业时间长的甚至能达到年薪百万。2017年,人工智能产业正在爆发今年的两会上,政府工作报告指出要加快培育壮大包括人工智能在内的新兴产业,人工智能首次被写入了政府工作报告。不仅政府重视,BAT企业更是投入重金。百度已经将人工智能列为核心发展战略,腾讯也广招人才,成立AI实验室等部门。再加上云计算等配套计算环境的成熟与完善,GPU云服务器、FPGA云服务器相继推出(如腾讯云),人工智能产业今年或将迎来一个爆发式发展时期。政府和企业对人工智能产业越来越重视,云计算使得AI工程师的门槛逐步降低。如何成为一名AI工程师,俨然成为程序员重点讨论的热门话题之一。什么样的人可以成为AI工程师?薪酬如何?基于腾讯云上的Python爬虫,我们抓取了几家主流招聘网站的AI相关的技术岗位,剔除重复数据和非工程师类的岗位需求,AI相关的技术岗位样本量为231份。最高薪酬的56个岗位(60-100万,100万+两档),要求硕士以

  • 用 Taichi 加速 Python:提速 100+ 倍!

    以下文章来源于太极图形,作者太极图形Python已经成为世界上最流行的编程语言,尤其在深度学习、数据科学等领域占据主导地位。但是由于其解释执行的属性,Python较低的性能很影响它在计算密集(比如多重for循环)的场景下发挥作用,实在让人又爱又恨。如果你是一名经常需要使用Python进行密集计算的开发者,我相信你肯定会有下面的类似经历:我的Python程序里面有个很大的for循环,循环体里面全是密集的计算,跑起来好慢啊...我的程序里面只有一小部分计算是性能瓶颈,虽然可以用C++改写然后用ctypes绑定一下,但是那样会很麻烦,还会有在别的机器上编译不了的风险。我希望所有的工作都能在一个Python脚本中完成!我之前是忠实的C++/Fortran用户,但是最近周围的同学用Python的越来越多,我也想试试Python,但是无奈很多祖传代码用Python改写以后就会慢100多倍,我接受不了...我的工作中需要处理大量图片数据,而需要的图像处理功能OpenCV又不提供,只能自己手写两重for循环,在Python里面这么搞真是太痛苦了...如果你有类似的烦恼,那真的值得了解一下Taichi。

  • [转]【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。

    困扰我大半年的错误,今天偶然间被解决了,特此分享给被同样问题纠结的朋友们! 之前的求助帖,无人应答: http://www.cnblogs.com/freeton/archive/2012/08/28/2660585.html http://bbs.csdn.net/topics/391988642 症状 日志中大量报错,IIS严重错误,此类错误默认情况下5分钟连续出现5次会导致IIS应用程序池直接挂掉,挂掉之后应用基本上是废掉了,访问量越高,挂的越快! 临时补救该错误的一个方法为,调整应用程序池“服务不可用”响应类型为TcpLevel,这样好歹应用程序池不会挂了,但问题依旧存在。   分析症状 0、搜一下,基本都是这个解决方案http://www.cnblogs.com/freeton/archive/2012/08/28/2660585.html,屁用不中 1、按照直接思维,感觉应该是服务器配置上哪里出了问题,应为本机调试环境下,从来没碰到过这个问题,于是乎更换服务器,winserver08=>winserver2012r2无奈问题依旧 2、乖乖分析上述日志错

  • AB/Testing 实验平台

  • JS基础(上)

    JS与DOM的关系 浏览器有渲染html代码的功能,把html源码(如div,p标签等)在内存里形成一个DOM对象   文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。DOM 将HTML文档呈现为带有元素、属性和文本的树结构(节点树)。     HTML文档可以说由节点构成的集合,三种常见的DOM节点: 1. 元素节点:上图中<html>、<body>、<p>等都是元素节点,即标签。 2. 文本节点:向用户展示的内容,如<li>里的内容JavaScript、DOM、CSS等文本。 3. 属性节点:元素属性,如<a>标签的链接属性href="http://www.imooc.com"。   BOM对象(把浏览器的地址栏,历史记录,DOM等装在一个对象) 浏览器内部有JS解释器/引擎;在html里的JS代码会被引擎所执行,执行的结果是对DOM对象的操作(即是对节点树内的标签进行

  • 和声进行的基本框架

    目录一、调式的重点概念7个级动音、静音主音、属音、下属音正三和弦副三和弦二、给哪些音配和弦三、和弦编配的基本框架1.用同调的三和弦,快速写出框架2.加入副属和弦3.纵向替换和弦,使和弦听觉更丰富4.平行大小调和弦替换5.使用斜线和弦,让连接更顺畅 一、调式的重点概念 最近简单学习了一下和声,感觉这东西还是挺有意思的。 正常的说,这不是我这种辣鸡钢琴水平现阶段应该接触的东西,因为涉及到的乐理知识比较多。 但是话说回来,作为一个有色彩学、哲学、文学、体育、代码等多维度基础的人类,合理利用顶层思维和跨行业的知识结合来学,会更高效深入一点。 下面是一点心得,为了方便理解,都用C大调为例来说明,其他调照这样的方式类推就可以了。 7个级 不管是大调还是小调,音阶都是都是由1到7级这样的结构来排列,到第8音升高八度回到相同的音名 动音、静音 每个调的135为静音,2467为动音 静音稳定,给人一种安定、有终止结束的感觉。 动音不稳定,是需要解决的音。 主音、属音、下属音 音阶中的每一个音符都有名称,我们称每个调的第一个音为主音,第五个音为属音,第四个音为下属音 正三和弦 主、属、下属音为

  • [BZOJ4198]荷马史诗 哈夫曼编码

    4198:[Noi2015]荷马史诗 TimeLimit: 10Sec  MemoryLimit: 512MB Description 追逐影子的人,自己就是影子。——荷马 Allison最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,Allison想通过一种编码方式使得它变得短一些。 一部《荷马史诗》中有n种不同的单词,从1到n进行编号。其中第i种单词出现的总次数为wi。Allison想要用k进制串si来替换第i种单词,使得其满足如下要求: 对于任意的1≤i,j≤n,i≠j,都有:si不是sj的前缀。 现在Allison想要知道,如何选择si,才能使替换以后得到的新的《荷马史诗》长度最小。在确保总长度最小的情况下,Allison还想知道最长的si的最短长度是多少? 一个字符串被称为k进制字符串,当且仅当它的每个字符是0到k−1之间(包括0和k−1)的整数。 字符串Str1被称为字符串Str2的前缀,当且仅当:存在1≤t≤

  • Python基础语法之文件操作

    1读文件   1.1简单读文件 1f=open('text','r')#f是文件句柄 2data=f.read()#read方法可以加整型参数,是几就读几个字符 3print(data) 4f.close()复制   1.2readline()和readlines()     readline():每次读文件中的一句。     readlines():将整个文件中的字符全部读出,并将其存在一个列表里,列表中的每个元素是文件中的一句。     在读大文件时尽量不要用readlines,太占用内存。 1f=open('text','r') 2a=f.readline() 3b=f.readline() 4c=f.readline() 5d=f.readline() 6print(a)#mynameisBob 7print(b)#Iam18yearsold 8print(c)#Ilikelearning 9print(d)#Ihaveadog复制 f=open('text','r') lines=f.readlines() print(lines) #['mynameisBob\n

  • 【转】java线程系列---Runnable和Thread的区别

     在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,   下面看例子:    packageorg.thread.demo;   classMyThreadextendsThread{   privateStringname;   publicMyThread(Stringname){   super();   this.name=name;   }   publicvoidrun(){   for(inti=0;i<10;i++){   System.out.println("线程开始:"+this.name+",i="+i);   }   }   }   packageorg.thread.demo;   publicclassThreadDemo01{   publicstaticvoidmain(String[

  • Hopfield Network 霍普菲尔德网络入门

    简介 HopfieldNetwork(霍普菲尔德网络),是Hopfield在1982年提出的一种基于能量的模型,发表的文章是Neuralnetworksandphysicalsystemswithemergentcollectivecomputationalabilities。基本结构如下图所示: 首先我们来看HopfieldNetwork的一句话定义: HopfieldNetworkisamodelthatcanreconstructdataafterbeingfedwithcorruptversionsofthesamedata. 也就是说利用HopfieldNetwork的过程是: \[some\data\→\Hopfield\Network\→\full\data \]可以看到HopfieldNetwork的几个基本特点: 只有单层 神经元节点之间是全连接的 只有输入,没有输出 主要功能是: 联想记忆associatIvememory,例如重新构建图形。假设我们在网络中存储了右侧的三张图片,如果我们只输入一部分图片,例如左侧的六张图片,网络可以从记忆中取出完整的图像。

  • The app icon set named &quot;AppIcon&quot; did not have any applicable content.

    AppIcon的@2@3分别是在29、40、60的基础上而不是界面上的58、80、120  用Sketch导出的时候1倍2倍正好  

  • 谈谈哥的python爬虫书写之路

     为了做一个百度网盘搜索引擎,哥开始研究爬虫,从此迷上爬虫而一发不可收拾,现在就大概谈谈哥的爬虫之路,顺便给出引擎:http://www.quzhuanpan.com     首先基本的Python语法你要了解吧,推荐一本书《Python基础教程》,很适合入门。   其次分析你的爬虫需求。程序具体 流程是怎么样的?把程序的大致框架搭起来。另外可能还有哪些难点?     然后了解一下一般写爬虫需要用哪些库,这些库可以很好的帮助你解决很多问题。推荐强悍的 Requests:HTTPforHumans 另外还有其他一些库如 urllib2BeautifulSoup都可以了解下。     动手开始写了,遇到问题Google即可,Google不行就上知乎问,我遇到的一个问题就是知乎私信大牛解决的。在写的过程中还会学到很多相关的知识,比如说HTTP协议,多线程等等。    &nbs

相关推荐

推荐阅读