• 武汉黄浦中西医结合医院不孕不育网络预约平台,随时与在线医生对话,可直接预约接诊医生,免挂号费,来院直接就诊,方便省时又省钱!
网站地图| 预约挂号| 来院路线
  • 城镇医保定点医院
  • 新型农村合作医疗定点单位

您当前的位置:主页 > 男性不育 > 正文

求通俗易懂解释下nceloss

来源:互联网   时间:2020-02-26 15:30:25

Tensorflow实现了两种常用与word2vec的loss,sampledsoftmax和NCE,这两种loss本身可以用于任意分类问题。之前一直不太懂这两种方法,感觉高深莫测,正好最近搞懂了,借tensorflow的代码和大家一起分享一下我的理解,也记录一下思路。这两个方法跟绝大多数deeplearning的方法一样,相当粗暴。目的两个方法的目标是在分类的数量太大时,简化softmax计算,采取估算的方法得到softmax的值。IntuitiveexplanationNCEloss的直观想法:把多分类问题转化成二分类。之前计算softmax的时候class数量太大,NCE索性就把分类缩减为二分类问题。之前的问题是计算某个类的归一化概率是多少,二分类的问题是input和label正确匹配的概率是多少。二分类问题群众喜闻乐见,直接上logisticregression估算一下概率。(这算不算是通俗易懂回答了答主的问题)Sampledsoftmax则是只抽取一部分样本计算softmax。这个想法也很好理解,训练的时候我不需要特别精准的softmax归一化概率,我只需要一个粗略值做backpropoagation就好了。当然这么粗糙的计算会不会出什么问题,从我个人的理解上看,不会。大部分优化器很可能比这粗糙的多,deeplearning就是门乱拳打死老师傅的学科。Tensorflow的实现(能直接读代码的直接读代码,当然和我一样的入门选手可以一起研究研究源码)先说一下啊,在tensorflow里,这两个loss的实现都异常简洁,当然其中藏着各种细节可以挖掘,在这里我们主要从算法实现角度看着两个loss实现。首先是NCElossdefnce_loss(weights,biases,labels,inputs,num_sampled,num_classes,num_true=1,sampled_values=None,remove_accidental_hits=False,partition_strategy="mod",name="nce_loss"):logits,labels=_compute_sampled_logits(weights=weights,biases=biases,labels=labels,inputs=inputs,num_sampled=num_sampled,num_classes=num_classes,num_true=num_true,sampled_values=sampled_values,subtract_log_q=True,remove_accidental_hits=remove_accidental_hits,partition_strategy=partition_strategy,name=name)sampled_losses=sigmoid_cross_entropy_with_logits(labels=labels,logits=logits,name="sampled_losses")#sampled_lossesisbatch_sizex{true_loss,sampled_losses...}#Wesumouttrueandsampledlosses.return_sum_rows(sampled_losses)NCE的实现就由这三部分组成,从名字上看,_compute_sampled_logits负责采样,sigmoid_cross_entropy_with_logits负责做logisticregression,然后计算用crossentropyloss,_sum_rows求和。这三个函数我们由简入繁,慢慢剥皮。首先_sum_rows代码很简单,先看comments,_sum_rows的arg是sampledloss,一个[batch_size,1+sample_num]的矩阵。_sum_rows函数直接构造了一个onestensor与sampledloss做矩阵乘法,最后reshape成一个[batch_size]的vector输出,vector中每一个element是trueloss与sampledloss之和。由上面我们可以推测和之前的了解,sigmoid_cross_entropy_with_logits应该是用对logits和labels求了logisticloss。defsigmoid_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,name=None):nn_ops._ensure_xent_args("sigmoid_cross_entropy_with_logits",_sentinel,labels,logits)withops.name_scope(name,"logistic_loss",[logits,labels])asname:logits=ops.convert_to_tensor(logits,name="logits")labels=ops.convert_to_tensor(labels,name="labels")try:labels.get_shape().merge_with(logits.get_shape())exceptValueError:raiseValueError("logitsandlabelsmusthavethesameshape(%svs%s)"%(logits.get_shape(),labels.get_shape()))zeros=array_ops.zeros_like(logits,dtype=logits.dtype)cond=(logits>=zeros)relu_logits=array_ops.where(cond,logits,zeros)neg_abs_logits=array_ops.where(cond,-logits,logits)returnmath_ops.add(relu_logits-logits*labels,math_ops.log1p(math_ops.exp(neg_abs_logits)),name=name)从上面的源码看到,在这个函数里,所有的运算都是elementwise上的sigmoid运算。这里源码的注释提到了他们采取的logsiticcrossentropy简易算法。由此,我们可以得知,logits与label,以及输出的sampledloss都是相同的shape。_compute_sampled_logits是同时出现在NCEloss和sampledsoftmax里计算logits的函数def_compute_sampled_logits(weights,biases,labels,inputs,num_sampled,num_classes,num_true=1,sampled_values=None,subtract_log_q=True,remove_accidental_hits=False,partition_strategy="mod",name=None):ifisinstance(weights,variables.PartitionedVariable):weights=list(weights)ifnotisinstance(weights,list):weights=[weights]withops.name_scope(name,"compute_sampled_logits",weights+[biases,inputs,labels]):iflabels.dtype!=dtypes.int64:labels=math_ops.cast(labels,dtypes.int64)labels_flat=array_ops.reshape(labels,[-1])#Samplethenegativelabels.#sampledshape:[num_sampled]tensor#true_expected_countshape=[batch_size,1]tensor#sampled_expected_countshape=[num_sampled]tensorifsampled_valuesisNone:sampled_values=candidate_sampling_ops.log_uniform_candidate_sampler(true_classes=labels,num_true=num_true,num_sampled=num_sampled,unique=True,range_max=num_classes)sampled,true_expected_count,sampled_expected_count=(array_ops.stop_gradient(s)forsinsampled_values)sampled=math_ops.cast(sampled,dtypes.int64)#labels_flatisa[batch_size*num_true]tensor#sampledisa[num_sampled]inttensorall_ids=array_ops.concat([labels_flat,sampled],0)#Retrievethetrueweightsandthelogitsofthesampledweights.#weightsshapeis[num_classes,dim]all_w=embedding_ops.embedding_lookup(weights,all_ids,partition_strategy=partition_strategy)#true_wshapeis[batch_size*num_true,dim]true_w=array_ops.slice(all_w,[0,0],array_ops.stack([array_ops.shape(labels_flat)[0],-1]))sampled_w=array_ops.slice(all_w,array_ops.stack([array_ops.shape(labels_flat)[0],0]),[-1,-1])#inputshasshape[batch_size,dim]#sampled_whasshape[num_sampled,dim]#ApplyX*W',whichyields[batch_size,num_sampled]sampled_logits=math_ops.matmul(inputs,sampled_w,transpose_b=True)#Retrievethetrueandsampledbiases,computethetruelogits,and#addthebiasestothetrueandsampledlogits.all_b=embedding_ops.embedding_lookup(biases,all_ids,partition_strategy=partition_strategy)#true_bisa[batch_size*num_true]tensor#sampled_bisa[num_sampled]floattensortrue_b=array_ops.slice(all_b,[0],array_ops.shape(labels_flat))sampled_b=array_ops.slice(all_b,array_ops.shape(labels_flat),[-1])#inputsshapeis[batch_size,dim]#true_wshapeis[batch_size*num_true,dim]#row_wise_dotsis[batch_size,num_true,dim]dim=array_ops.shape(true_w)[1:2]new_true_w_shape=array_ops.concat([[-1,num_true],dim],0)row_wise_dots=math_ops.multiply(array_ops.expand_dims(inputs,1),array_ops.reshape(true_w,new_true_w_shape))#Wewanttherow-wisedotplusbiaseswhichyieldsa#[batch_size,num_true]tensoroftrue_logits.dots_as_matrix=array_ops.reshape(row_wise_dots,array_ops.concat([[-1],dim],0))true_logits=array_ops.reshape(_sum_rows(dots_as_matrix),[-1,num_true])true_b=array_ops.reshape(true_b,[-1,num_true])true_logits+=true_bsampled_logits+=sampled_bifremove_accidental_hits:acc_hits=candidate_sampling_ops.compute_accidental_hits(labels,sampled,num_true=num_true)acc_indices,acc_ids,acc_weights=acc_hits#ThisishowSparseToDenseexpectstheindices.acc_indices_2d=array_ops.reshape(acc_indices,[-1,1])acc_ids_2d_int32=array_ops.reshape(math_ops.cast(acc_ids,dtypes.int32),[-1,1])sparse_indices=array_ops.concat([acc_indices_2d,acc_ids_2d_int32],1,"sparse_indices")#Createsampled_logits_shape=[batch_size,num_sampled]sampled_logits_shape=array_ops.concat([array_ops.shape(labels)[:1],array_ops.expand_dims(num_sampled,0)],0)ifsampled_logits.dtype!=acc_weights.dtype:acc_weights=math_ops.cast(acc_weights,sampled_logits.dtype)sampled_logits+=sparse_ops.sparse_to_dense(sparse_indices,sampled_logits_shape,acc_weights,default_value=0.0,validate_indices=False)ifsubtract_log_q:#SubtractlogofQ(l),priorprobabilitythatlappearsinsampled.true_logits-=math_ops.log(true_expected_count)sampled_logits-=math_ops.log(sampled_expected_count)#Constructoutputlogitsandlabels.Thetruelabels/logitsstartatcol0.out_logits=array_ops.concat([true_logits,sampled_logits],1)#true_logitsisafloattensor,ones_like(true_logits)isafloattensor#ofones.Wethendividebynum_truetoensuretheper-examplelabelssum#to1.0,i.e.formaproperprobabilitydistribution.out_labels=array_ops.concat([array_ops.ones_like(true_logits)/num_true,array_ops.zeros_like(sampled_logits)],1)returnout_logits,out_labels还没写完,有时间再继续referencehttps://www.quora.com/What-is-negative-sampling-in-Word2vechttps://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/python/ops/nn_impl.py

咨询>>主诊医生

  • 擅长:输卵管堵塞、粘连等问题导致的女性不孕,多囊卵巢综合症等...[详细]

  • 擅长:操作各种高难度宫腹腔镜微创手术,治疗子宫肌瘤、卵巢囊肿等...[详细]

  • 擅长:宫腹腔镜微创手术及三镜一丝等技术,有效疏通阻塞的输卵管等...[详细]

  • 擅长:中西医结合促排卵,腹腔镜手术配合中医中药技术,治疗女性不孕等...[详细]

  • 擅长:利用中西医结合及各种高科技疗法治疗各种妇科疾病导致的女性不孕等...[详细]

  • 擅长:使用妇科内窥镜手术治疗,特别是运用宫腹腔镜治疗输卵管性不孕等...[详细]

  • 擅长:治疗各种妇科疾病导致的不孕症,如输卵管、卵巢、子宫问题等...[详细]

  • 擅长:治疗内分泌失调、输卵管阻塞、子宫内膜异位症等问题导致的不孕...[详细]

  • 擅长:治疗输卵管不通、排卵障碍、内分泌失调、卵巢早衰等问题导致的不孕...[详细]

  • 擅长:少弱精、畸形精子、无精、早泄、性功能障碍等问题导致的男性不育...[详细]

  • 擅长:运用新式微创手术治疗生殖畸形疾病、泌尿感染、前列腺炎等...[详细]

  • 擅长:运用中医或中西结合辨证论治的治疗方法,对各种原因导致的不孕症...[详细]

  • 擅长:运用宫腹腔镜联合诊疗输卵管不孕问题、卵巢问题或子宫性不孕等...[详细]

推荐阅读

人工降雨引发暴雨 广西发现天

你要的那些内容,基本上都包含在如下点里,可以仔细的看看。看完这点,你对教育行业估计会有一个整体的认知了……脱离教学本质谈商业,行不通;脱...[详细]

武汉黄浦中西医结合医院

门诊时间:8:00 ~ 17:00
官方QQ:1635437696 免费咨询热线:400-9961-009
郑重声明:本站信息仅供参考,不能作为医疗的依据,不能代替医院和主诊医生的诊断和治疗

用微信扫一扫
加武汉黄浦医院为好友
与在线医生直接对话