多目标建模算法PLE

1. 概述

在现如今的推荐系统或者搜索中,都存在多个目标,多目标的算法在现如今的系统中已然成为了标配。在多目标的建模过程中,如果不同的学习任务之间较为相关时,多个任务之间可以共享一部分的信息,这样最终能够提升整体的模型学习效果。但是如果多个任务之间的相关性并不强,或者说多个任务之间存在某种冲突,这样通过部分的共享就会起到事与愿违的效果,这便是通常所说的在多任务建模中出现的负迁移(negative transfer)现象,即在相关性不强或者无相关性的多任务环境下进行信息共享,最终影响整体的网络效果,MMo[1]便是在这样的情况下被提出。在MMoE中,通过共享多个专家(expert)实现信息的共享,同时针对每一个上层任务(task)都有对应的门控函数(gate),学习到多个专家对于特定任务的贡献程度,即专家的分布。以此,实现了对任务之间的关联和区别的学习。

然而,在多任务建模过程中,还存在另外一种现象,称为跷跷板现象(seesaw phenomenon)。简单来说,跷跷板现象就是在对多个目标进行优化的过程中,一个任务指标的提升伴随着另外一些任务指标的下降。出现这种现象的主要原因是多个任务之间出现较多的共享,MMoE算法中也不能有效解决这样的一个问题。PLE(Progressive Layered Extraction)[2]模型在MMoE的基础上通过对共享的网络结构优化,在原先的共享部分,又增加了task-specific的部分,同时,为了增强网络的效果,构造了多层的网络结构。

2. 算法原理

2.1. Customized Gate Control

为解决上述提出的两个问题,参考[2]中首先提出了CGC(Customized Gate Control)网络。在CGC网络中,在共享专家网络的基础上,又针对特定的任务有特定的专家网络,以此增强每个任务的效果。CGC的网络结构如下图所示:

在CGC的网络结构中,其底层网络包括了shared experts和task-specific expert两个部分,且每一个expert部分都是由多个expert组成,上层针对每一个任务都有一个门控网络,且门控网络的输入是共享的experts和该任务对应的experts。由此可见,在CGC网络中,既包含了task-specific网络针对特定任务独有的信息,也包含了shared网络共享的信息,以上图为例,假设\left [ E_{\left ( k,1 \right )}^T,E_{\left ( k,2 \right )}^T,\cdots, E_{\left ( k,m_k \right )}^T \right ] 为指定任务k 对应的多个专家的输出,\left [ E_{\left ( s,1 \right )}^T,E_{\left ( s,2 \right )}^T,\cdots, E_{\left ( s,m_s \right )}^T \right ] 为共享部分的多个专家的输出,这两个输出组合成上层门控网络的输入S^k\left ( x \right )

S^k\left ( x \right )=\left [ E_{\left ( k,1 \right )}^T,E_{\left ( k,2 \right )}^T,\cdots, E_{\left ( k,m_k \right )}^T, E_{\left ( s,1 \right )}^T,E_{\left ( s,2 \right )}^T,\cdots, E_{\left ( s,m_s \right )}^T \right ]

门控网络的计算输出g^k\left ( x \right ) 为:

g^k\left ( x \right )=w^k\left ( x \right )S^k\left ( x \right )

其中,w^k\left ( x \right )=Softmax\left ( W_g^kx \right ) ,且W_g^k\in \mathbb{R}^{\left ( m_k+m_s \right )\times d}

2.2. Progressive Layered Extraction

在深度学习中,为了使得模型能够具有更好的泛化能力,通常的方法是构建更深的网络。同样,为了能够得到更具有泛化能力的网络,可以将上述网络构建得更深,这便有了PLE结构。简单来说,PLE结构可以看做是CGC网络结构的扩展,由single-level的CGC衍生为multi-level的PLE。具体的PLE网络结构如下图所示:

与CGC网络相比,除了第一个Extraction Network的输入是原始的Input,其余的Extraction Network的输入是上一个Extraction Network的输出,即包含两个大的部分,即特定任务对应的专家网络输出,如上图中的Experts A和Experts B的输出,另外一个是共享专家网络的输出,如上图中的Experts Shared的输出。

2.3. 损失函数

在多任务重,其损失函数为各任务损失的加权求和,即为:

L_k\left ( \theta _1,\cdots ,\theta _K,\theta _s \right )=\sum_{k=1}^{K}\omega _kL_k\left ( \theta _k,\theta _s \right )

`

其中,\omega _k 为第k 个任务的权重,对于权重的设置,参考[2]中给出了如下的迭代公式:

\omega _k^{\left ( t \right )}=\omega _{k,0}\times \gamma _k^t

其中,\gamma _k 为更新率。对于任务k 的损失函数L_k\left ( \theta _k,\theta _s \right ) ,参考[2]中给出了如下的公式:

L_k\left ( \theta _k,\theta _s \right )=\frac{1}{\sum_{i}\delta _k^i}\sum_{i}\delta _k^i\;loss_k\left ( \hat{y}_k^i\left ( \theta _k,\theta _s \right ),y_k^i \right )

因为存在不同任务上的样本空间不一致的问题,因此在特定的任务中计算损失函数时,选择在其空间上的样本,即对于\delta _k^i ,其取值为0 或者1 ,表示的是第i 个样本是否属于第k 个任务的样本空间。

3. 总结

为了解决多任务模型中普遍存在的负迁移和跷跷板现象,在MMoE模型的基础上提出了CGC模型,在共享专家的基础上增加了针对特定任务的专家网络,可以针对特定任务学习到独有的网络部分,从而避免任务之间的相互影响,同时为了进一步提升整体网络的泛化效果,在CGC的基础上通过堆叠Extraction Network构造了更深的网络结构,进一步提升多任务模型的学习效果。

参考文献

1 Ma J, Zhao Z, Yi X, et al. Modeling task relationships in multi-task learning with multi-gate mixture-of-expertsC//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018: 1930-1939.

2 Tang H, Liu J, Zhao M, et al. Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendationsC//Fourteenth ACM Conference on Recommender Systems. 2020: 269-278.

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

相关文章

  • 10分钟手撸Java线程池,yyds!!

    大家好,我是冰河~~最近有不少小伙伴私信我说:看了我在【精通高并发系列】文章中写的深度解析线程池源码部分的文章,但是还是有些不明白线程池的实现原理。问我能不能手写一个简单的线程池,帮助读者深刻理解线程池的原理。这不,我熬夜肝了这篇文章。在【精通高并发系列】的文章中,我们曾经深度解析过线程池的源码,从源码层面深度解析了线程池的实现原理。其实,源码是原理落地的最直接体现,看懂源码对于深刻理解原理有着很大的帮助。但是不少小伙伴看源码时,总觉得源码太枯燥了,看不懂。那今天,我们就一起花10分钟手撸一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理。本文的整体结构如下所示。Java线程池核心原理看过Java线程池源码的小伙伴都知道,在Java线程池中最核心的类就是ThreadPoolExecutor,而在ThreadPoolExecutor类中最核心的构造方法就是带有7个参数的构造方法,如下所示。publicThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit,

  • 跨界也疯狂:当对冲基金掌管一只棒球队

    量化投资与机器学习微信公众号,是业内垂直于量化投资、对冲基金、Fintech、人工智能、大数据等领域的主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险、高校等行业30W+关注者,荣获2021年度AMMA优秀品牌力、优秀洞察力大奖,连续2年被腾讯云+社区评选为“年度最佳作者”。 棒球与对冲基金Point72最近在寻找名叫“新兴技术侦察员”的人选,以帮助它在学术界和供应商生态系统中跟进新技术的发展。同时,Point72还在寻找一名应用计算机视觉的人工智能研究员,研究与计算机视觉、情感计算和其他领域相关最先进的人工智能模型,这些模型可以对金融服务、资产管理行业和体育行业产生变革性的影响和适用性。体育行业?是的,他也将为大都会棒球队效力。自从Point72的首席执行官史蒂夫 • 科恩从美国职棒大联盟(MLB)球队纽约大都会队的所有者SterlingPartners的手中收购这支球队后,在这18个月里,棒球界一直在思考,科恩会如何利用自己巨大的资源和财富来管理这支球队。答案既简单又具有革命性:他把自己的对冲基金带到了纽约大都会队!史蒂夫 • 科恩在纽约大都会棒球队 根据员工的L

  • 精灵之息 开发日志(4)

    这周的数据和上周的有啥区别么……不行了,这个时候必须说一些安慰的话,或者找个打代码的来帮忙背锅了。 我找不到愿意帮我打代码的。 那只能说一些安慰的话了。比如,虽然这条曲线没有变化,但是其他地方的数据变好了呀。比如糖果屋的打开率变成36%,比如留存和在线变多了呀……还是说下这周做了哪些调整 其实这周整体没改什么东西,重点在查询“教程1-教程2”之间流失的原因。流失过程大致上是这样的玩家从选择章节后,到进入游戏之间流失了4%,然后在阿呆这里待了3-5秒,之后开始又流失了4%,也就是打败阿呆的其实还是有91%左右。 第一个4%可以理解成游戏崩了或者其他的? 第二个4%就是单纯不想玩。 而最诡异的地方就在于,打赢阿呆后停留在胜利结算界面不点确定的有8%左右…… 为啥啊。实际上在所有的引导中,“强制操作”的引导流失率反而是最低的,我忽然理解现在市面上大部分游戏为啥教程非要“下一步”“下一步”的完全不留玩家自由操作的空间。 就像曾经一些页面,你如果让玩家“点一下确定”,大部分人会点,但是如果让玩家输入一串字符,流失就会发生。这样好么? 如果认可了这个理论,那么很显然那些“每日签到”“连续七天领好礼

  • 聊聊dubbo-go-proxy的ConsulRegistryLoad

    序本文主要研究一下dubbo-go-proxy的ConsulRegistryLoadLoaderdubbo-go-proxy/pkg/registry/load.go//Loaderthisinterfacedefinedforloadservicesfromdifferentkindsregistry,suchasnacos,consul,zookeeper. typeLoaderinterface{ //LoadAllServicesloadallservicesregisteredinregistry LoadAllServices()([]*common.URL,error) //GetClustergettheregistryname GetCluster()(string,error) }复制Loader接口定义了LoadAllServices、GetCluster方法 ConsulRegistryLoaddubbo-go-proxy/pkg/registry/consul.gofuncinit(){ var_Loader=new(ConsulRegistryLoad) }

  • 【初识Go】| Day11 反射机制

    反射是什么反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。有时候我们需要编写一个函数能够处理一类并不满足普通公共接口的类型的值,也可能是因为它们并没有确定的表示方式,或者是在我们设计该函数的时候这些类型可能还不存在。Go语言提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法,但是在编译时并不知道这些变量的具体类型,这称为反射机制。反射的作用1.在编写不定传参类型函数的时候,或传入类型过多时典型应用是对象关系映射typeUserstruct{ gorm.Model Namestring Agesql.NullInt64 Birthday*time.Time Emailstring`gorm:"type:varchar(100);unique_index"` Rolestring`gorm:"size:255"`//setfieldsizeto255 MemberNumber*string`gorm:"unique;notnull"`//setmembernum

  • 腾讯全球数字生态大会智能教育专场上线 战略升级推出全新解决方案

    9月10日,2020腾讯全球数字生态大会智能教育专场在“云端”举行。腾讯高级执行副总裁、云与智慧产业事业群总裁汤道生,腾讯云副总裁、腾讯教育副总裁王涛,腾讯教育副总裁、腾讯在线教育部总经理陈书俊,腾讯云副总裁、腾讯教育副总裁付曼青等出席并作为智能教育专场的“数字倡导官”,剖析了在疫情、新基建等背景之下,行业未来的发展趋势。专场期间,腾讯教育除了启动旗下多个产品的最新业务战略升级之外,还正式发布了面向教学场景全流程的操作系统——“腾讯教育智脑”,希望以统一身份认证为基础,以场景化教学工具为抓手,以结构化知识图谱为支撑,助力教学全场景数字化,实现教学效率和品质的双项提升。与此同时,中国工程院院士、武汉大学党委常委、副校长李建成,清华大学党委常委、副校长杨斌,教育学部规划建设发展中心主任陈锋,华东师范大学副校长周傲英,深圳职业技术学院副校长马晓明,上海市电化教育馆馆长张治等专家学者也同期在云端亮相,携手共绘智能教育未来蓝图。首份《中国智慧教育区域发展研究报告(2020)》正式发布,为教育主管部门、学校、企业决策提供行业发展现状参考。此外,通过云端展厅,腾讯教育全面展示了其在智慧教育领域的创新

  • Django object.get_or_create()的使用方法

    使用get_or_create()使用方式 user,b=User.objects.get_or_create(u_id=1,name="张三",defaults={'address':'上海'})print(user)等同于 users=User.objects.get(u_id=1,name="张三")ifuser:print(user)else:user=User.objects.create(u_id=1,name="张三",address="上海")print(user)关于get_or_create()说明get_or_create顾名思义,查询或者创建一条数据,首先是执行的时候首先会去查询有没有这个值,如果有就返回,没有就创建。get_or_create会返回一个tuple,第一个值是查到或者创建的数据,第二个值是一个布尔,表示是否执行了创建操作。在进行查询的时候和使用get查询类似,当查到超过一条数据的时候会触发MultipleObjectsRetur

  • Python os 模块文件操作

    #【Python】计算当前文件夹下所有文件的大小 import os all_files = os.listdir(os.curdir)            #os.curdir表示当前目录。也可使用'.' file_dict = dict()                           #声明一个空字典 for each_file in all_files:     if os.path.isfile(each_file):            #判断是否是文件         file_size = os.path.getsize(each_file)         file_dict[each_file] = file_size         for each in file_dict.items():    #以列表返回可遍历的(键, 值) 元组数组     print('%s\t%dBytes' % (each[0],each[1]))                     #小甲鱼课后习题30.4 def print

  • 规制与惩责:区块链金融交易刑事犯罪分析

    区块链曾昕/刘滔(上海市海华永泰(长沙)律师事务所)|宣发:自链财经摘要:近年来,区块链技术成为了互联网领域炙手可热的前沿科技,在互联网创新领域具有非凡的作用,呈现出“后互联网时代”的发展趋势。区块链本身是一种中立性技术,但不法分子以获取非法利益为目的,利用其交易的去中心化、匿名性、跨界性等特征,通过区块链数字货币在金融领域进行集资诈骗、逃税以及组织领导传销活动罪等违法犯罪活动,对我国的社会、经济发展造成了巨大的危害。为此,本文首先从区块链在金融领域应用入手,客观阐述数字区块链金融交易的现状,进一步重点剖析区块链金融交易所涉嫌的刑事罪名,最后提出我国有关机关对区块链金融交易领域的侦防启示及监管建议。随着区块链逐渐深入我国社会、经济市场,比特币、USDT、以太坊等区块链数字货币逐渐被人们所知悉。区块链在金融领域可以推动数据信息共享、提高传输效率,实现征信科学化,但弊端也是显而易见的,如金融调控无法实现、监管难度加大,亦会助长洗钱、逃避外汇等违法犯罪活动。一、概述区块链是指通过去中心化和去信任的方式,集体维护一个可靠数据库的技术[1]。随着区块链技术的快速发展与全面普及,以区块链技术作为力

  • 程序化广告生态圈——需求方

    需求方作为流量的需求方,分为两个大群体:一个是广告主,一个是广告公司,通常也叫广告代理商:广告主(Advertiser)广告主是为推销产品或者提供服务而购买流量进行广告投放,通常就是花钱的角色。 广告主按照效果类型可以分为效果广告主和品牌广告主。效果广告主的目标通常是容易衡量的转化,以提升直接转化为核心目标,附带品牌效果。通常是常年按需投放,以效果计费,容易衡量,如下载、注册、下单等,以CPA和CPS结算居多,考核的指标主要是CPC、CPA、ROI和CTR等,更多的是考虑投入产出的情况,典型的行业有游戏和电商类。效果广告主通常会用第三方检测工具是GoolgeAnalytics、AdobeAnalytics、TalkingData、友盟……往往非常在意投入产出,转化、ROI,经常会看渠道或归因报告。品牌广告主通常以建立品牌形象,传达品牌理念为广告的核心,通常以CPM结算居多,品牌广告是通常根据节假和活动等营销节点排期投放,一波波的Campaign,排期式投放。通常考核的TA%、3+Reach和各种指数,典型的行业有汽车和快消。品牌广告主通常会用秒针、AdMaster、百度/谷歌指数,DC

  • 腾讯云大学大咖分享 | 解密OCR文字识别技术

    腾讯云大学大咖分享之解密OCR文字识别技术课程讲师:腾讯云高级工程师彭碧发讲师简介:毕业于华中科技大学,负责智能图像相关AI产品,熟悉AI视觉工程化,对计算机图像处理有一定的理解,现担任腾讯云大数据及人工智能产品中心高级工程师。那么直播中有哪些值得关注的内容呢?学习君和你一起来回顾一下!OCR通俗来说就是让计算机看图识字的技术,比如在生活中,使用手机可以对身份证进行拍照,并通过一种技术将身份证照片上的文字自动转换成文本信息,这种技术就是OCR其中一种应用场景。这是腾讯云OCR具体的产品定位:腾讯云OCR在性能、应用场景多样性和接入产品能力方面都具有优势,便于开发者的使用。产品架构则主要由数据层、服务层、平台层和应用层四个层次组成。在平台层方面,这次直播课主要讲的时图片OCR,像身份证识别、手写体识别等功能,开发者都可以通过API接口和SDK的形式去使用。腾讯云OCR可提供的服务主要分为6个大类,包括通用文字识别、卡证文字识别、票据单据识别、资产证件识别、汽车相关识别和行业文档识别,继续细分共有24种服务;其中通用印刷体识别和身份证识别是最重要的服务。开发者可以通过小程序或网页版的演示D

  • 恶犬秒变萌汪:东京大学开源“治愈系”GAN图片拼贴工具 | 技术头条

    译者|linstancy 责编|琥珀出品|AI科技大本营(id:rgznai100)教新手画画?字体风格迁移?换明星“假脸”?毫无疑问,在图像生成中GAN以其生成以假乱真的图像“发挥”出了巨大的潜力。日前,来自日本东京大学和PreferredNetworks公司的团队开源了一款名为「neuralcollage」的图像编辑工具,允许用户在图像的制定位置更改图像的语义信息,以达到图像拼贴的效果。链接:https://github.com/pfnet-research/neural-collage例如,将一只面露凶光的哈士奇的图片换脸成为可爱的博美。而更值得一提的是,整个过程的中间操作非常简单。如何使用和安装?首先保证Python3.6以上的语言环境,并安装所需的Python库:pipinstall-rrequirements.txt如果想要使用预训练模型生成图像,项目作者该提供了链接以下载模型。需要注意的是,将snapshot参数设置为下载的预训练模型文件(.npz)的路径。相关链接:https://drive.google.com/drive/u/0/folders/1SFmq9LjEk

  • WanShare‘天天分红’计划喊你来躺赚

    现代人房子、车子、票子、妻子、儿子处处都要钱钱钱鸭梨山大与其苦等币一夜暴涨不如边收益边看涨WanShare‘天天分红’计划(详情请登录wanshare平台官网或者关注官方微信:wanshare88查看)喊你来躺赚WanShare平台将于6月15日正式上线“天天分红”计划天天分红计划上线后将会把平台每日手续费收入的百分之五十做为分红基金次日按占比奖励给在交易平台上持有CCEC的用户也就是说您持有的CCEC越多奖励越多详细规则:1、参与WanShare“天天分红”活动的用户CCEC持有量需≥100;2、WanShare将每日交易手续费的50%利润,分配给上述CCEC持有者;3、收入分配以日为一个分配周期,2018年7月15日零点开始计算,2018年7月16日为首个分配日,我们将于当天一次性分配7月15日累积的待分配收入。之后的每一天,会将前一天累积的所有待分配收入,一次性按比例分给CCEC持有者;4、个人当日分红量=个人持有CCEC数量/CCEC流通总量(1360万)*平台当日交易手续费*50%;5、分红发放时间:每日凌晨2:00-4:00;6、分红统一以CCEC发放;7、WanShare

  • 《Redis设计与实现》读书笔记(五) ——Redis中的整数集合

    《Redis设计与实现》读书笔记(五)——Redis中的整数集合(原创内容,转载请注明来源,谢谢)一、概述整数集合(intset)是redis数据结构集合(set)的底层实现之一,如果set中只包含整数元素,且元素个数不多时,redis会使用整数集合作为set的底层实现。二、整数集合实现整数集合是redis保存整数值集合的底层实现,可以保存int16_t、int32_t、int64_t的整数值,且集合中每个值都不一样。结构如下:typedefstructintset{ uint32_tencoding; uint32_tlength; int8_tcontents[]; }intset;复制其中,encoding是编码方式,length是集合的元素个数,contents是保存集合中的元素,每个元素在contents数组中,从小到大排列。contents虽然被定义是int8_t类型,但是实际是根据encoding进行确认。如果encoding是INTSET_ENC_INT16,则contents里面每一个元素都是int16_t类型(值在-32768~32767);如果是INTSET_EN

  • 一:计算机基础入门及介绍[通俗易懂]

    计算机基础入门篇1.计算机系统 计算机(Conputer):俗称电脑,一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速的处理,然后把处理结果输出的现代化智能电子设备。计算机有很多的形式类型,例如:生活中常见的家用电脑、平板电脑、台式机、一体机等,还有生产环境中所提供重要业务支撑的各种服务器【server】,这些都算作是计算机。 其中一个完整的计算机系统:是由计算机系统硬件【Hardware】系统与软件【Software】系统两大部分所组成。 1.2计算机硬件 计算机发展历史说明: 1.第一代计算机(1946-1957)电子管时代 2.第二代计算机(1958-1964)晶体管时代 3.第三代计算机(1965-1970)集成电路时代 4.第四代计算机(1971以后)大规模集成电路时代世界上第一台大型计算机 1946年,世界上第一台计算机ENIAC(electronicnumericalintegratorandcalculator电子数字积分 计算机)在美国宾州大学诞生,是美国奥伯丁武器试验场为了满足计算弹道需要而研制成的。使 用了17468只电子管,占地170平方

  • 编译TypeScript(TypeScript转JavaScript)

    1.配置tsconfig.json文件 tsconfig.json文件配置说明 { "compilerOptions":{//生成相关说明,TypeScript编译器如何编译.ts文件。 "module":"commonjs",//指定模块代码生成:“none”、“commonjs”、“amd”、“system”、“umd”、“es2015”或“esnext”。 "target":"es6",//指定ECMAScript目标版本。许可值为“es3”、“es5”、“es6”、“es2015”、“es2016”、“es2017”、“es2018”或“esnext”。 "lib":["es6"],//指定要包含在编译中的库文件。需要TypeScript2.0或更高版本。 "sourceMap":true,//是否生成相应的“地图”的文件。 "rootDir":"src",//指定输入文件的根目录。使用——outDir控制输出目录结构。 "outDir":"out"//将输出结构重定向到目录。 } } 复制 2.编译命令 npminstall-gtypescript

  • Jenkinsfile与Json的转换

    前段时间调研了下青云的kubesphere,意外的发现了一个插件,pipeline-model-definition-plugin,用了将jenkins的pipeline、json互相转换的,以前可能关注过这个插件,但是没怎么注意,jenkins的plugin上面也没有找到,不知道为什么,所以,这里简单讲解一下吧。 一、安装 jenkins的plugin上面没有提供,所以只能自己打包编译,github上面也给出了打包的过程:cdpipeline-model-definition&&mvninstall&&mvnhpi:run,然后将hpi文件上传到插件即可。 二、主要api接口 2.1获取pipeline的json格式JSONSchema URL:JENKINS_URL/pipeline-model-schema/json Info:获取json格式的jenkinsfile Returns:json 2.2将jenkinsfile转成json格式 URL:JENKINS_URL/pipeline-model-converter/toJson Parame

  • mac平台打造犀利的Android Studio开发环境

    0x0背景介绍    随着AndroidStudio功能越来越强大,Android平台的开发者们基本上都从原来的Eclipse+ADT转到了AS上。本文就记录自己在配置AS环境过程中遇到的各种问题,方便后来者节约时间。     本文主要介绍在AS2.0中,如何借助新的android编译插件,进行NDK开发,包括调试。     注:笔者的系统版本是:OSX10.10.5(是的,并没有升级到10.11...主要是担心很多软件出bug..)     整个配置需求:     ①AndroidStudio2.0     ②gradle版本>=gradle2.10     ③gradle-experimental:0.7.0-alpha1(与当前gradle版本一一对应,对应表见这里的gradlerequirement部分)  &nbs

  • 《架构即未来》读后感(三)

    1、系统分析模式 面向流程拆分:按照业务流程拆分成几个阶段 面向服务拆分:将系统提供的服务拆分 面向功能拆分:将系统提供的功能拆分 2、扩展模式分析 做好架构,系统在实际工作时才好按照团队设计好工作分解、用人所长;架构清楚方便进行开发和维护;结构清晰才好方便部署。仅就可扩展性来说,架构清晰的才会真正做到高内聚、低耦合,修改和封装才能有效开展。 3、分层架构 一般是2~5层,最常用的是3层架构。 C/S机构、B/S架构。 MVC架构、MVP架构 逻辑分层架构。大系统的架构师,上来就是一张逻辑分层的技术架构图,往往来上很多层。比如:基础设施层、数据接入层、资源整合层、公共服务支撑层、应用层、展示层等等,不一而足。往往是画个很漂亮的大图,一堆属于把人整晕,实际改怎么干根本没概念。分层架构的设计上,一般每层上、下会有一个虚拟接口层,屏蔽掉外部接口复杂性。缺点也明显,就是层层传递,效率会降低,架构上有些重。不过在目前 不管怎么分层,关键不是图好不好看,而是逻辑要清晰。高内聚、低耦合。层级之间差异足够清晰、边界足够明显,便于理解和实施。确实一张好的图,比100页文档好;一张混乱的美图,只

  • 一些问题

      此文为本月第一篇随笔,也是最后一篇,曾许诺自己每月一篇,肚中无货,权当充数。   很多问题想不明白,花10分钟罗列下,经常回看,想想答案。   1.为什么会有博客园这样的东西   不明白,真的会有人那么无私,把自己的平生所学都贡献出来么?我看未必,那为什么会有那么多的大牛来园子里码字呢?为名?为利?为成就感?还是为了给某个猎头看到?我也有过这样的感觉,当帮助别人解决了一个难题后,那感觉一般人体会不到,但也不是一直都会这么感觉。有时候观点冲突,还会引来口水大战。有人说在写博的过程中可以锻炼自己的总结能力和表达能力,我不是很赞同,你要锻炼这些,可以在你的电脑里新建个记事本,在里面慢慢写,何必要公之于众?有的人说这是境界,每个修行的人,都必须经历这个“传道”的境界。很遗憾,不我太相信这世上有这么纯粹的人。为什么,还会有那么多傻兮兮的人在这里花半天时间来“春蚕吐丝”呢?也许,以后会明白,也许,已经有了答案...   2.有些东西你永远不会看到    最近老婆听到她的一个女同事新交了一个男朋友,月薪15K,某理工大学研究生,刚毕业,供职于华为...真是年轻有为啊

  • powermock单元测试小结

      最近时不时的需要单元测试来写覆盖率。简单总结一下日常心得: 1.首先指明需要测试的类:@PrepareForTest({RewardGoldServiceImpl.class}) 2.其次在测试类中new出被测试对象:@InjectMocks                             RewardGoldServiceImplrewardGoldService=newRewardGoldServiceImpl();  3.然后在遇到所需测试类中的dao方法时候,进行mock:@Mock                

相关推荐

推荐阅读