精华内容
下载资源
问答
  • 对比举例子
    万次阅读
    2021-01-14 04:05:53

    对比是修辞方法,就是把两种不同事物或者同一事物的两个不同方面放在一起相互比较的一种辞格。

    对比的句子你能举出两个这样的例子吗?这样写有什幺好

    鳕鱼一次产卵竟达千万粒,真正能变成幼鱼的卵可能还不到1%。

    列数字:准确,有科学根据 打比方:天上的星星像一颗颗宝石。

    作比较:春天的雨细腻柔媚,夏天的雨粗犷热烈。

    举例子:晕能预示天气。

    比如,在新疆地区,出现晕就代表将要下雨。

    (根据大的范围列举相应的例子 举列子 为了给混噩的世人敲响警钟,联合国在大力推行全球生物多样性保护行动的同时,特地将1997年"六 五"世界环境日的主题定为"为了地球的生命" 打比方 有修剪得像宝塔那样的松柏,没有阅兵式似的道旁树,因为依据中国画的审美观点,这是不足取的。

    作比较 大自然对人类的影响远比海洋对人类的影响深远. 列数字 不是巧合.作为地球上生命之源的水,97%也蕴藏在蔚蓝色的大海里.其余不组3%的淡水又有接近2/3冻结在南极洲和格陵兰的冰层中.

    有哪些是举例子 列数字 作比较 打比方的句子

    对比是修辞方法,就是把两种不同事物或者同一事物的两个不同方面放在一起相互比较的一种辞格。

    例如: 虚心使人进步,骄傲使人落后 有缺点的战士终竟是战士,完美的苍蝇也终竟不过是苍蝇青年是朝阳,老年是夕阳政之所兴,在顺民心;政之所废,在逆民心。

    《管子.牧民篇》亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。

    《出师表》诸葛亮

    含有对比手法的句子

    更多相关内容
  • 敏捷的商业价值是什么,与传统对比的特点是什么?敏捷决不再局限于研发的生产阶段,是贯穿软件生命周期,敏捷价值也只有充分体现在产品在从一个...  一个恰当的例子,如果我用敏捷方法生产钢笔,敏捷规划了大致四部
  • 陈述: 就是想看一下贝叶斯学派的陈述,从...1.首先举例子说明具体的设计类 问题 2.叙述大数据背景,优化数据均在的各种特性     3. 说明贝叶斯优化在各中不同行业的别名,以及具体的 应用场景 贝叶斯...

    陈述:     就是想看一下贝叶斯学派的陈述,从不同的学派的对比,看看有什么优缺点,然后自己思考下。 

    摘要:

    通过设计恰当的概率代理模型和采集函数,贝叶斯优化框架只需经过少数次目标函数评估即可获得理想解。

    引言:

    1.首先举例子说明具体的设计类 问题

    2.叙述大数据背景,优化数据均在的各种特性

     

     

    3. 说明贝叶斯优化在各中不同行业的别名,以及具体的 应用场景

    贝叶斯优化(Bayesian Optimization,简称 BO)是一个有效的解决方法[1].贝叶斯优化在不同的领域也称作序贯克里金优化(Sequential Kriging Optimization,简称 SKO)、基于模型的序贯优化(Sequential Model-Based Optimization,简称 SMBO)、高效全局优化(Efficient Global Optimization,简称EGO).该方法是一种基于模型的序贯优化III方法,能够在很少的评估代价下得到一个近似最优解.贝叶斯优化已经应用于网页[2,3,4]、游戏[5]和材料设计[6]、推荐系统[7,8]、用户界面交互[9,10]、机器人步态[11]、导航[12]和嵌入式学习系统[13]、环境监控[14]、组合优化[15,16]、自动机器学习[17,18,19,20,21,22]、传感器网络[23,24]等领域

     贝叶斯优化

     贝叶斯优化是一个十分有效的全局优化算法,目标是找到(全局最优解.根据对未知目标函数 f 获取的信息,找到下一个评估位置,使得最快地达到最优解[26].例如:若已经评估得到三个不同输入 x1、x2、x3 的目标函数值 y1、y2、y3,则如何选择下一个评估点?贝叶斯优化框架能够在少数次评估下得到复杂目标函数的最优解,

    本质上因为贝叶斯优化框架使用代理模型拟合真实目标函数,并根据拟合结果主动选择最有“潜力”的评估点进行评估,避免不必要的采样,因此贝叶斯优化也称作主动优化(active optimization).同时,贝叶斯优化框架能够有效利用完整的历史信息来提高搜索效率

    贝叶斯定律:

     

     

    与无模型(model-free)优化算法的对比作者论文中的陈述:

     

    (1)贝叶斯优化通过主动选择策略来确定下一个最有“潜力”的评估点.相比无模型优化方法的随机跳转或邻域搜索策略,主动选择策略利用历史信息和不确定性,通过最大化根据模型后验分布构造的采集函数,能够有效地平衡宽度搜索(探索不确定性区域获取更多未知信息)与深度搜索(利用已有信息寻找当前最优)之间的关系,从而减少不必要的目标函数评估。

    (2)无模型 关注于求解效率(这个我是不明白,我只知道进化算法关注于 精度,速度)贝叶斯更侧重于减少评估代价(实际的 应用中,评估代价有些是可以缩减的 吗?,怎么理解?)保证其能够仅经过 少数次目标函数评估就 可得到最优解。

    陈述:贝叶斯的局限性:

    (1)无模型优化算法不需要考虑模型更新问题,而贝叶斯优化在更新概率代理模型时需要高昂的计算开销.如:使用高斯过程代理黑箱函数时,模型更新的时间复杂度为立方阶.

    (2)相比无模型的优化方法,贝叶斯优化需要谨慎地选择模型和先验.使用贝叶斯方法解决具体问题时,需要根据问题背景和专家知识选择合适的概率模型来代理黑箱函数.为贝叶斯优化选择合适的概率代理模型甚至比选择恰当的采集函数更为重要.目前,还不存在一种通用的方法为贝叶斯优化选择合适的代理模型和先验分布,都是采取具体问题具体分析的策略
     

    作者的表--------这个有根据吗?我读这个表中的叙述,什么 样的所谓 先验知识?(PSO中的pbest不算?)

    感悟:

       阅读到这里的时候就觉得作者写的很好,陈述的都很 连贯。然而就是觉的对进化计算的优缺点陈述哪里,以及表对比哪里 觉得有些不可思议啊

    进化计算不需要模型不需要进行辅助,是需要进行多次的迭代,但 算法关注 收敛速度,也不是毫无顾忌的“迭代次数无下限”,还有对表里面的我没有见过也不懂, 就是觉得看结果对比那么多劣势,质疑。  而且我 个人觉的贝叶斯中的主动选择策略,在进化计算中应该是可以达到的吧,也可以最为 改进的方向,就是慢慢的看, 主动选择的概念, 以及操作喽。

    展开全文
  • Java 文本内容差异对比实现介绍

    千次阅读 2021-12-02 17:09:03
    一个最常见的例子,我们使用git进行提交时,通常会使用git diff --cached来查看这次提交做了哪些改动,这里我们先简单定义一下什么是diff:diff就是目标文本和源文本之间的区别,也就是将源文本变成目标文本所需要...

    前言

    本文是关于文本对比和通过diff算法的简单介绍,如果你想快速通过java+html或者纯JavaScript来实现两文件并排对比可看我另一篇文章:

    文本对比,文本差异并排对比显示实现

    一、文本差异对比介绍

    在这里插入图片描述

    举一个最常见的例子,我们使用git进行提交时,通常会使用git diff --cached来查看这次提交做了哪些改动,这里我们先简单定义一下什么是diff:diff就是目标文本和源文本之间的区别,也就是将源文本变成目标文本所需要的操作。

    在 Git 中,有四种diff算法,分别是Myers、Minimal、Patience和Histogram,它们用于获取位于两个不同提交中的两个相同文件的差异。

    Myers算法由Eugene W.Myers在1986年发表的一篇论文中提出,是一个能在大部分情况产生”最短的直观的“diff的一个算法。

    文本差异对比涉及到的算法介绍 :
    How different are different diff algorithms in Git
    Myers Diff 差分算法

    好用的在线文本对比: 在线文本比较工具

    好用的桌面文本对比软件:MeldDiffMergexxdiffDiffuseKompare

    常见的文本差异对比库:

    1.java-diff-utils

    2.diff-match-patch

    本文通过java-diff-utils库来实现文本差异对比

    二、依赖下载

    jar下载网址:io.github.java-diff-utils:java-diff-utils:4.11

    官方git地址:java-diff-utils

    官方demo示例: java-diff-utils Examples

    如果你使用Maven:

    <dependency>
      <groupId>io.github.java-diff-utils</groupId>
      <artifactId>java-diff-utils</artifactId>
      <version>4.11</version>
    </dependency>
    

    如果你使用Gradle:

    implementation 'io.github.java-diff-utils:java-diff-utils:4.11'
    

    本文下面会用到的三个对比文本如下:

    test1.txt 和 test3.txt :

    _this.ispc = function(){
      var userAgentInfo = navigator.userAgent;
        var Agents = ["Android", "iPhone",
                    "SymbianOS", "Windows Phone",
                    "iPad", "iPod"];
        var flag = true;
        for (var v = 0; v < Agents.length; v++) {
            if (userAgentInfo.indexOf(Agents[v]) > 0) {
                flag = false;
                break;
            }
        }
        return  flag;
    }
    window._assignInfo = {};
    window._curnodepersons = [];
    window.attachmode = '0';
    window.isEsignature = false;
    window.upList = [];
    window.downList = [];
    window.billId = '';
    window.upProcessIdList = [];
    window.downProcessIdList = [];
    var urlsplit = window.location.href.split("#");
    if(urlsplit.length>1){
      //alert(window.location.href);
     	location.href = urlsplit[0];
    }
    

    test2.txt:

    _this.ispc = function(){
      var userAgentInfo = navigator.userAgent;
        var Agents = ["Android", "iPhone",
                    "SymbianOS", "Windows Phone",
                    "iPad", "iPod"];
        var flag = true;
        for (var v = 0; v < Agents.length; v++) {
            if (userAgentInfo.indexOf(Agents[v]) > 0) {
                flag = false;
    insert1;
    insert2;
                break;
            }
        }
        return  flag;
    }
    window._assignInfo = {};
    window._curnodepersons = [];
    window.attachmode = '0';
    window.isEsignature = false;
    
    
    add
    window.billId = '';
    window.upProcessIdList = [];
    window.downProcessIdList = [];
    var urlsplit = window.location.href.split("#");
    if(urlsplit.length>1){
      //alert(window.location.href);
     	location.href = qazwer[0];
    }
    

    三、获取两文件的不同点-patch

    		//原始文件
            List<String> original = Files.readAllLines(new File("D:\\test1.txt").toPath());
            //对比文件
            List<String> revised = Files.readAllLines(new File("D:\\test2.txt").toPath());
    
            //两文件的不同点
            Patch<String> patch = DiffUtils.diff(original, revised);
            for (AbstractDelta<String> delta : patch.getDeltas()) {
                System.out.println(delta);
            }
    

    输出:

    [InsertDelta, position: 9, lines: [insert1;, insert2;]]
    [ChangeDelta, position: 18, lines: [window.upList = [];, window.downList = [];] to [, , add]]
    [ChangeDelta, position: 26, lines: [ 	location.href = urlsplit[0];] to [ 	location.href = qazwer[0];]]
    

    InsertDelta代表插入的,ChangeDelta代表删除的或修改的。position代表第几行,lines代表内容。

    四、根据patch生成统一的差异格式unifiedDiff

    		//原始文件
            List<String> original = Files.readAllLines(new File("D:\\test1.txt").toPath());
            //对比文件
            List<String> revised = Files.readAllLines(new File("D:\\test2.txt").toPath());
    
            //两文件的不同点
            Patch<String> patch = DiffUtils.diff(original, revised);
    
    		//生成统一的差异格式
            List<String> unifiedDiff = UnifiedDiffUtils.generateUnifiedDiff("test1.txt", "test2.txt", original, patch, 0);
            unifiedDiff.forEach(System.out::println);
    

    输出diff:

    --- test1.txt
    +++ test2.txt
    @@ -10,0 +10,2 @@
    +insert1;
    +insert2;
    @@ -19,2 +21,3 @@
    -window.upList = [];
    -window.downList = [];
    +
    +
    +add
    @@ -27,1 +30,1 @@
    - 	location.href = urlsplit[0];
    + 	location.href = qazwer[0];
    

    说明:

    关于输出的diff可参考 :读懂diff

    减号代表原始文件test1.txt,加号代表对比文件test2.txt

    @@ -10,0 +10,2 @@
    +insert1;
    +insert2
    

    表示test2增加了2行,分别加了insert1;和insert2这两行

    @@ -19,2 +21,3 @@
    -window.upList = [];
    -window.downList = [];
    +
    +
    +add
    

    表示test2删除了2行,删除的这两行是test1从19行开始的2行;然后test2又增加了3行,增加是3行是从test2的21行开始的。

    @@ -27,1 +30,1 @@
    - 	location.href = urlsplit[0];
    + 	location.href = qazwer[0];
    

    表示test2删除了1行,删除的这行是test1从27行开始的1行;然后test2又增加了1行,增加是1行是从test2的30行开始的。(相当于这一行进行了修改)

    前端页面美化输出:
    如果想将上面通过Java代码得到的两个文件的差异美化输出可以 参考我另一篇博客:Java+html实现文本对比 实现效果如下:

    在这里插入图片描述
    如果想获取全部内容对比,要把diff加入到文件内容中,也就是上面代码的diffString 替换为如下(没改动的代码前要加一个空格才会显示):

        const diffString = `
    --- test1.txt
    +++ test2.txt
    @@ -0,0 +0,0 @@
     this.ispc = function(){
      var userAgentInfo = navigator.userAgent;
        var Agents = ["Android", "iPhone",
                    "SymbianOS", "Windows Phone",
                    "iPad", "iPod"];
        var flag = true;
        for (var v = 0; v < Agents.length; v++) {
            if (userAgentInfo.indexOf(Agents[v]) > 0) {
                flag = false;
    @@ -10,0 +10,2 @@			
    +insert1;
    +insert2;
                break;
            }
        }
        return  flag;
    }
     window._assignInfo = {};
     window._curnodepersons = [];
     window.attachmode = '0';
     window.isEsignature = false;
    @@ -19,2 +21,3 @@
    -window.upList = [];
    -window.downList = [];
    +
    +
    +add
     window.billId = ;
     window.upProcessIdList = [];
     window.downProcessIdList = [];
     var urlsplit = window.location.href.split();
     if(urlsplit.length>1){
      //alert(window.location.href);
    @@ -27,1 +30,1 @@
    - 	location.href = urlsplit[0];
    + 	location.href = qazwer[0];
     }
    `;
    

    在这里插入图片描述

    如果你想通过js获取diff,然后通过diff2html渲染到界面可以参考:
    实现Diff页面的工程实践
    vue-diff-demo

    五、根据unifiedDiff打补丁

    假设你有test1.txt、test2.txt、test3.txt 三个内容一样的文件,有一天你改了test2.txt的文件内容,你想把test2.txt修改的地方也同步的修改运用到 test3.txt上就可以通过打补丁的方式来实现。简单的来说就是test1.txt、test2.txt进行对比得到 unifiedDiff ,把 unifiedDiff运用到 test3.txt 。(相当于git的不同分支的代码同步)

    		//原始文件
            List<String> original = Files.readAllLines(new File("D:\\test1.txt").toPath());
            //对比文件
            List<String> revised = Files.readAllLines(new File("D:\\test2.txt").toPath());
    
            //两文件的不同点
            Patch<String> patch = DiffUtils.diff(original, revised);
    
            //生成统一的差异格式
            List<String> unifiedDiff = UnifiedDiffUtils.generateUnifiedDiff("test1.txt", "test2.txt", original, patch, 0);
    
            //从文件或此处从内存导入统一差异格式到补丁
            Patch<String> importedPatch = UnifiedDiffUtils.parseUnifiedDiff(unifiedDiff);
    
            List<String> test3 = Files.readAllLines(new File("D:\\test3.txt").toPath());
    
            //将差异运用到其他文件打补丁,即将不同点运用到其他文件(相当于git的冲突合并)
            List<String> patchedText = DiffUtils.patch(test3, importedPatch);
            for (String patchedTextPow : patchedText) {
                System.out.println(patchedTextPow);
            }
    

    输出:

    _this.ispc = function(){
      var userAgentInfo = navigator.userAgent;
        var Agents = ["Android", "iPhone",
                    "SymbianOS", "Windows Phone",
                    "iPad", "iPod"];
        var flag = true;
        for (var v = 0; v < Agents.length; v++) {
            if (userAgentInfo.indexOf(Agents[v]) > 0) {
                flag = false;
    insert1;
    insert2;
                break;
            }
        }
        return  flag;
    }
    window._assignInfo = {};
    window._curnodepersons = [];
    window.attachmode = '0';
    window.isEsignature = false;
    
    
    add
    window.billId = '';
    window.upProcessIdList = [];
    window.downProcessIdList = [];
    var urlsplit = window.location.href.split("#");
    if(urlsplit.length>1){
      //alert(window.location.href);
     	location.href = qazwer[0];
    }
    

    六、对比两文件的不同点并按行显示不同

    		//原始文件
            List<String> text1= Files.readAllLines(new File("D:\\test2.txt").toPath());
            //对比文件
            List<String> text2=Files.readAllLines(new File("D:\\test1.txt").toPath());
    
            //行比较器,原文件删除的内容用"~"包裹,对比文件新增的内容用"**"包裹
            DiffRowGenerator generator = DiffRowGenerator.create()
                    .showInlineDiffs(true)
                    .inlineDiffByWord(true)
                    .oldTag(f -> "~")
                    .newTag(f -> "**")
                    .build();
            //通过行比较器对比得到每一行的不同
            List<DiffRow> rows = generator.generateDiffRows(text1, text2);
    
            //输出每一行的原始文件和对比文件,每一行的原始文件和对比文件通过 "|"分割
            for (DiffRow row : rows) {
                System.out.println(row.getOldLine() + "|" + row.getNewLine());
            }
    

    输出:

    _this.ispc = function(){|_this.ispc = function(){
      var userAgentInfo = navigator.userAgent;|  var userAgentInfo = navigator.userAgent;
        var Agents = ["Android", "iPhone",|    var Agents = ["Android", "iPhone",
                    "SymbianOS", "Windows Phone",|                "SymbianOS", "Windows Phone",
                    "iPad", "iPod"];|                "iPad", "iPod"];
        var flag = true;|    var flag = true;
        for (var v = 0; v &lt; Agents.length; v++) {|    for (var v = 0; v &lt; Agents.length; v++) {
            if (userAgentInfo.indexOf(Agents[v]) &gt; 0) {|        if (userAgentInfo.indexOf(Agents[v]) &gt; 0) {
                flag = false;|            flag = false;
    ~insert1;~|
    ~insert2;~|
                break;|            break;
            }|        }
        }|    }
        return  flag;|    return  flag;
    }|}
    window._assignInfo = {};|window._assignInfo = {};
    window._curnodepersons = [];|window._curnodepersons = [];
    window.attachmode = '0';|window.attachmode = '0';
    window.isEsignature = false;|window.isEsignature = false;
    |**window.upList = [];**
    |**window.downList = [];**
    ~add~|
    window.billId = '';|window.billId = '';
    window.upProcessIdList = [];|window.upProcessIdList = [];
    window.downProcessIdList = [];|window.downProcessIdList = [];
    var urlsplit = window.location.href.split("#");|var urlsplit = window.location.href.split("#");
    if(urlsplit.length&gt;1){|if(urlsplit.length&gt;1){
      //alert(window.location.href);|  //alert(window.location.href);
         location.href = ~qazwer~[0];|     location.href = **urlsplit**[0];
    }|}
    

    参考:

    Diffing more quickly
    Compare files side by side and hightlight diff using Java | Apache Commons Text diff | Myers algorithm
    Myers diff algorithm vs Hunt–McIlroy algorithm

    展开全文
  • 本文从对比学习的概念出发,收集了五个2020年的关于对比学习的经典研究,详细介绍了每个工作的模型及思路过程,帮助大家快速掌握对比学习的原理和发展的脉络。 对比学习的概念很早就有了,但真正成为热门方向是在...

    本文从对比学习的概念出发,收集了五个2020年的关于对比学习的经典研究,详细介绍了每个工作的模型及思路过程,帮助大家快速掌握对比学习的原理和发展的脉络。 

    对比学习的概念很早就有了,但真正成为热门方向是在2020年的2月份,Hinton组的Ting Chen提出了SimCLR,用该框架训练出的表示以7%的提升刷爆了之前的SOTA,甚至接近有监督模型的效果。在SimCLR推出后,各路大佬们又陆续提出了不少有意义的工作,本文将对2020年的一些对比学习经典研究进行总结,方便大家快速掌握这个方向的原理和发展脉络。

    首先再简要说下对比学习的基本原理,先从无监督表示学习讲起。表示学习的目标是为输入 x 学习一个表示 z ,最好的情况就是知道 z 就能知道 x 。这就引出了无监督表示学习的第一种做法:生成式自监督学习。比如还原句子中被mask的字,或者还原图像中被mask的像素。但这种方式的前提需要假设被mask的元素是相互独立的,不符合真实情况。另一方面,研究者们也质疑如此细粒度的还原是否真正必要

    举个例子,假如有人让你凭空画一张一美元,你可能只画成这样[1]

    图片

    而如果给你一张美元照着临摹,可能还能画好看点,比如这样:

    图片

    所以说我们记住的事物特征,不一定是像素级别的,而是更高维度的。更具体来说,比如用编码去做分类任务,我们不需要知道每个数据的细节,只要抓住每个类别的主要特征,自然就能把他们分开了:

    图片

    不重构数据,那如何衡量表示 z 的好坏呢?这时也可以用互信息 I(X,Z) ,代表我们知道了 Z 之后,X 的信息量减少了多少。如果对最大化互信息的目标进行推导[2],就会得到对比学习的loss(也称InfoNCE),其核心是通过计算样本表示间的距离,拉近正样本,拉远负样本。也就是说,当我们能够区分该样本的正负例时,得到的表示就够用了

    具体的做法是,输入N个图片,用不同的数据增强方法为每个图片生成两个view,分别对它们编码得到y和y'。我们对上下两批表示两两计算cosine,得到NxN的矩阵,每一行的对角线位置代表y和y'的相似度,其余代表y和N-1个负例的相似度。

    图片

    对每一行做softmax分类,采用交叉熵损失作为loss,就得到对比学习的损失了:


    其中 是可调节的系数。

    对比学习的原理很简单,比较粗暴的优化方向就是增加view难度、增加更多负例、提升encoder表现等。下面就让我们看看大佬们在这一年里是如何花式优化的。

    MoCo(CVPR20)

    既然对比是在正负例之间进行的,那负例越多,这个任务就越难,于是一个优化方向就是增加负例。

    纯粹的增大batch size是不行的,总会受到GPU内存限制。一个可行的办法就是增加memory bank,把之前编码好的样本存储起来,计算loss的时候一起作为负例:

    图片

    但这样有个问题是存储好的编码都是之前的编码器计算的,而的编码器一直在更新,会有两侧不一致的情况,影响目标优化。一个可行方法之一就是用最新的左侧encoder更新编码再放入memory bank,但这依然避免不了memory bank中表示不一致的情况,实验效果很差。还有研究用动量去更新样本表示,但这样必须存储所有样本,消耗过多内存。

    所以何凯明大佬在2019年底推出了MoCo(Momentum Contrast)模型[3],延续memory bank的思想,使用动量的方式更新encoder参数,解决新旧候选样本编码不一致的问题:

    图片

    对于每个batch x:

    1. 随机增强出  两种view

    2. 分别用  对输入进行编码得到归一化的 q 和 k,并去掉 k 的梯度更新

    3. 将 q 和 k 一一对应相乘得到正例的cosine(Nx1),再将 q 和队列中存储的K个负样本相乘(NxK),拼接起来的到 Nx(1+K) 大小的矩阵,这时第一个元素就是正例,直接计算交叉熵损失,更新  的参数

    4. 动量更新  的参数:

    5. 将 k 加入队列,把队首的旧编码出队,负例最多时有65536个

    这样每次入队的新编码都是上一步更新后的编码器输出,以很低的速度慢慢迭代,与旧编码尽量保持一致。实验发现,m=0.999时比m=0.9好上很多。最终在ImageNet的实验效果也远超前人,成为当时的SOTA:

    图片

    SimCLR(ICML20)

    SimCLR是Hinton组的Chen Ting在20年2月提出的工作,直接比MoCo高出了7个点,并直逼监督模型的结果:

    图片

    框架结构还是采用双塔:

    主要做了以下改动:

    1. 探究了不同的数据增强组合方式,选取了最优的

    2. 在encoder之后增加了一个非线性映射 。研究发现encoder编码后的会保留和数据增强变换相关的信息,而非线性层的作用就是去掉这些信息,让表示回归数据的本质。注意非线性层只在无监督训练时用,在迁移到其他任务时不使用

    3. 计算loss时多加了负例。以前都是拿右侧数据的N-1个作为负例,SimCLR将左侧的N-1个也加入了进来,总计2(N-1)个负例。另外SImCLR不采用memory bank,而是用更大的batch size,最多的时候bsz为8192,有16382个负例

    MoCo v2

    SimCLR推出后一个月,何凯明和Chen Xinlei同学对MoCo进行了一些小改动:

    1. 改进了数据增强方法

    2. 训练时在encoder的表示上增加了相同的非线性层

    3. 为了对比,学习率采用SimCLR的cosine衰减

    图片

    经过改动后,以更小的batch size就超过了SimCLR的表现:

    图片

    SimCLR v2(NIPS20)

    在2020年中,Hinton组的Chen Ting同学又提出了SimCLR v2[4],主要做了以下改动:

    1. 采用更深但维度略小的encoder,从 ResNet-50 (4×) 改到了 ResNet-152 (3×+SK),在1%的监督数据下提升了29个点

    2. 采用更深的3层MLP,并在迁移到下游任务时保留第一层(以前是完全舍弃),在1%的监督数据下提升了14个点

    3. 参考了MoCo使用memory,但由于batch已经足够大了,只有1%左右的提升

    最终模型比之前的SOTA好了不少:

    图片

    SwAV(NIPS20)

    对比学习需要很多负例进行比较,既耗时又耗内存,于是FAIR联合Inria也推出了一个新的方法SwAV。作者提出了一个新的想法:对各类样本进行聚类,然后去区分每类的类簇。模型结构如下:

    图片

    具体的做法是,先用K个点  表示聚类中心(prototypes),给定一个batch的编码 ,将其通过 C 映射到一组新的向量 。这里假设向量都是d维的[5],那C的维度就是 dxK,Z的维度是 dxB,Q的维度则是KxB,每个元素  相当于第k个聚类中心与第b个样本的相似度,理想情况下,样本与自己的类簇中心相似度为1,与其他的为0,其实就是一个one-hot label。不过作者发现soft label效果会好一些。这样每个样本又获得了一个新的表示(Codes)。

    有了 z 和 q 之后,理论上同一张图片不同view所产生的 z 和 q 也可以相互预测,作者便定义了新的loss:

    其中

    同时SwAV也提出了一种新的数据增强方法,将不同分辨率的view进行mix。最终两种方法的结合带来了4.2个点的提升:

    图片

    BYOL

    上文讲的方法来回都逃不过“对比”这个范式,而DeepMind提出的BYOL则给了我们一个不同视角。

    在表示学习中,我们现在采用的框架本质是通过一个view的表示去预测相同图像其他view,能预测对说明抓住了图像的本质特征。但在做这样的预测时会有坍缩(collapse)的风险,意思是全都变成一个表示,那也可以做到预测自己。对比学习为了解决这个问题,将表示预测问题转换为了正负例判别问题,这样就迫使模型的输出是多样的,避免坍缩。

    于是BYOL的作者想:如何不用负例,也能学到好的表示呢?如果共用encoder,用MSE作为损失,缩小相同图像不同view的距离,肯定会坍缩。而作者发现如果把其中一个encoder变成随机初始化的固定下来(stop gradient),就能达到18.8%的准确率。为了得到更好的encoder,作者参考动量的方法对其中一个encoder做了改进:

    图片

    这里我们按照论文,称上半部分为online(更新梯度),下半部分为target(不更新梯度)。BYOL的优化目的是用online表示预测target表示,采用MSE作为损失函数。Online梯度回传后,使用滑动平均对targe的encoder和MLP参数进行更新。在预测阶段只使用 。

    虽然BYOL没有显示地使用对比学习loss,但一篇博主在实验[6]中发现BYOL依靠的还是“对比”。他们在复现BYOL的时候直接基于了MoCo的代码,结果发现效果还没有随机的好,原来是因为MLP中没有加BN。如果深究BN的作用,就会发现它重新调整了输出的分布,避免坍缩,同时BN也在隐式地进行对比,去除batch内样本相同的部分,保留不同的特征

    同时,在不依赖负样本后,BYOL对于数据增强方法的选择更加鲁棒,下面是它的效果:

    图片

    SimSiam

    延续BYOL的思想,Chen Xinlei与何凯明大佬又对孪生网络进行了研究,发现stop-gradient是避免坍缩的关键,于是提出了SimSiam。

    SimSiam的结构非常简单:

    图片

    1. 左侧的编码器生成 ,经过MLP后输出 

    2. 右侧的编码器生成 

    3. 计算  与  的cosine相似度

    4. 左右调换,再计算  与  的cosine相似度

    5. 最大化3、4两个步骤的和,且右侧永远不传播梯度

    训练步骤虽然简洁,但为什么work却有很多学问。简单的解释是,对于整体目标的优化可以看作一个EM过程,左右两边交替更新,所以在更新左侧encoder时可以将右侧看成常数。更多的细节可以参考Andy的详解

    最终SimSiam的效果超过了众多前辈,但仍比BYOL差3个点:

    图片

    同时他们提到,孪生网络自带建模不变性(invariance)的归纳偏置(inductive bias):

    two observations of the same concept should produce the same outputs

    这个发现可以帮我们理解为什么孪生网络效果很好,表示学习就是要建模数据中的不变性。

    其他细节

    1. 数据增强方法

    图片

    SimCLR中对数据增强方法进行了研究,得到了两个结论:

    1. 不同的数据增强方式组合起来会更好,单一增强的任务太简单

    2. Crop和Color组合的方式最好,因为大多数图像中的颜色是比较一致的,即使裁剪也会容易辨认,如果去掉颜色会增加任务难度

    2. BatchNorm导致的信息泄露

    在分布式训练中,BN都是分别在各个设备上做的。而对比学习的正例对在一个机器上计算,会出现信息泄露。个人认为,在BN去除batch内共同特征时,很可能被归一化到相似的分布,降低任务难度。

    MoCo的解决办法是把一边的样本重新shuffle再并行,另一边顺序不变,这样batch的统计量就不同了;SimCLR的解法是计算一个全局的BN值。

    3. MLP

    在SimCLR以后的工作中都使用了MLP,SimSiam也对它的作用进行了探究:

    图片

    可以看到不使用MLP基本没效果可言。作者通过实验发现:MLP可能承担了估计整体期望的功能。这同SimCLR最初增加MLP时的发现是一致的,核心思想还是过滤表示中的无效特征,得到本质,服务于“对比”任务。

    总结

    对比学习在2020年异常火爆,CV领域的高质量研究层出不穷,很多都超过了有监督学习的表现。这次我们只介绍了无监督对比学习,实际上它在有监督任务上也有应用,同时NLP、Graph领域也都看得到它的身影。期待CV与NLP领域相互借鉴,碰撞出更好的工作。

    参考资料

    [1] Contrastive Self-Supervised Learning: https://ankeshanand.com/blog/2020/01/26/contrative-self-supervised-learning.html

    [2] 深度学习的互信息:无监督提取特: https://kexue.fm/archives/6024

    [3] Momentum Contrast for Unsupervised Visual Representation Learning: https://arxiv.org/pdf/1911.05722.pdf

    [4] Big Self-Supervised Models are Strong Semi-Supervised Learners: https://arxiv.org/pdf/2006.10029.pdf

    [5] representation learning与clustering的结合(3): SwAV: https://zhuanlan.zhihu.com/p/259975814

    [6] Understanding self-supervised and contrastive learning with BYOL: https://untitled-ai.github.io/understanding-self-supervised-contrastive-learning.html

    展开全文
  • 顺便说一下,T检验仅可对比两组数据的差异。如果数据为三组或更多,则使用方差分析。 另外还有其他研究差异关系的分析方法,有兴趣的话可以登录SPSSAU查看更多方法的使用说明。 相关资料 SPSSAU:方差分析、T检验、...
  • 2022 年 Flutter 适合我吗?Flutter VS Other 量化对比

    千次阅读 热门讨论 2022-04-09 17:31:04
    当然,在对比所有跨平台开发的这个环节里, Flutter 虽然不能说是最好,但是 React Native 绝对是最拉胯的,因为不管是 Weex 还是 React Native , node_module 黑洞一直都是头痛的问题: 例子,React Native ...
  • 前言:还是一篇入门文章。Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来
  • 对比学习(contrastive learning)

    万次阅读 多人点赞 2021-07-26 21:22:43
    个通俗的例子:即使不记得物体究竟是什么样子,我们也可以在野外识别物体。 我们通过记住高阶特征并忽略微观层面的细节来做到这一点。那么,现在的问题是,我们能否构建不关注像素级细节,只编码足以区分不同对象...
  • 进程和线程的区别,举例易懂

    千次阅读 2022-04-17 17:24:51
    什么是进程,进程就是计算机上运行的程序,对应在手机上就是各种应用程序,比如你玩的王者荣耀,和平精英,在手机和电脑上运行起来的程序就叫做进程,注意::是你打开了这个程序,而不是在桌面上放着。...
  • 本文主要分享一下Google今年提出的《Self-supervised Learning for Large-scale Item Recommendations》如何采用对比学习解决推荐长尾问题 。一、 定义长尾效应:20%的热门item占据了80%的曝光量,剩下80%的...
  • 对比学习(Contrastive Learning)综述

    千次阅读 2021-04-20 08:15:29
    对比引入 【拿我的画例子】我们可以看到下面两张图的马头和精细程度都是不同的,但是我们显然能判断这两张是类似的图,这是为什么呢 对于某个固定锚点x来说,其位置是由与其他点相对位置决定的,而不是画布的...
  • Spring WebFlux运用中的思考与对比

    万次阅读 2019-11-12 17:55:48
    本文通过几个问题,解析下Spring WebFlux用法最佳实践,并与另一框架Vertx作对比 1. 是否一定要用默认的Web容器,用自己的Web容器是否可以,同时是否可以有web和webflux 是可以的,这样的依赖是可行的(容器用tomcat...
  • 【数据分析方法】对比分析法

    千次阅读 2021-03-19 22:26:32
    怎样进行数据的对比分析? 数据分析(1):对比分析法 一文看懂对比分析方法 转载自:大白话系列:分析方法之对比分析 作者:风轻袖影翻 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请...
  • 个栗子,现有 productA 分支和 productB 分支,项目是一般在productA分支上做,合并到productB分支,但现在productB分支上的客户现在的需求越来越多,而且他们的需求productA上还用不到,所以只能在productB分支上...
  • 有2个Excel表格,列标题内容和顺序不完全一样。现需要把这2个表格合并到一个总表中。(按标题一 一对应)如果一列一列的粘...原来:Vlookup函数是横向(水平)查找Hlookup函数是坚向(垂直)查找个小例子,熟悉一下Hl...
  • 前馈控制与反馈控制对比

    千次阅读 2021-11-11 21:09:57
    自动控制系统中主要包含两大类控制,一种是前馈控制,另一种是反馈控制。那么二者之间究竟有怎么的区别和联系。... 参考文献 前馈控制、反馈控制及前馈-反馈控制的对比 控制系统中前馈控制与反馈控制的区别(全文)
  • 用Python实现一个简单的——人脸相似度对比

    万次阅读 多人点赞 2018-11-08 15:58:58
    近几年来,兴起了一股人工智能热潮,让人们见到了AI的能力和强大,比如图像识别,语音识别,机器翻译,无人驾驶等等。...今天就和大家交流下如何实现一个简易版的人脸对比,非常有趣! 整体思路: 1、预先导入...
  • 1、前馈控制属于开环控制,反馈控制属于负反馈的闭环控制 一般定值控制系统是按照测量值与给定值比较得到的偏差进行调节,属于闭环负反馈调节。其特点是在被控变量出现偏差后才进行调节;如果干扰已经发生而没有产生...
  • 首先明确下,拿Clickhouse这种OLAP来跟关系型数据库Oracle、内存MapReduce Spark、磁盘MapReduce Hive对比比性能,的确有点欺负人的感觉,但没办法,业务需求,为了说服IT部门给部署Clickhouse集群,千万级的数据量...
  • 互联网的成功和端到端原则

    千次阅读 2022-03-24 18:02:51
    最后,我做一个对比,铁路和公路。本来我想用TCP/IP网络和传统电信网络直接说的,可最终觉得还是铁路和公路最合适。 铁路属于中心控制,复杂性在路网而不在火车,火车只保有启动,加速,刹车,鸣笛等简单功能即可。...
  • 对比其他工具,Python具有的3个优点

    千次阅读 2020-12-09 14:15:19
    如果你对数据分析有所了解,一定听说过一些亲民的工具如Excel、Tableau、PowerBI等,都能成为数据分析的得力助手。但它们的不足也是...Python优点一:“流程可控,工作高效”例子,Excel做分析的过程:定...
  • 点击上方蓝字关注我们对比分析是数据分析中最常用的、最好用、最实用分析方法之一。没有对比就不能说明问题,这也是对比分析在数据分析领域经久不衰的原因之一。对比分析是将两个或两个以上具有可比性的...
  • 对比学习是自监督的一种,现在很火。自监督属于无监督的一种,即没有标记数据,相当于 cluster 聚类来判断物体类别(所以在label少的时候,unsupervised learning可以帮助我们学到data本身的high-level information...
  • 首先介绍下为什么下一代神经网络需要无监督对比学习。目前整个人工智能行业的落地,其实都依赖于监督学习模式,无论是OCR、ASR、TTS、ImageDetection,如果没有大量的标注,是很难训练出商业化程度的模型的。这个...
  • 【软件测试基础】等价类划分法

    千次阅读 2021-07-27 02:38:40
    在上面例子弱一般等价类的用例如下: 弱一般等价类 3.2强一般等价类 强一般等价类是基于多缺陷假设,强一般等价类的测试用例是要覆盖每个有效等价类取值的笛卡尔积。即在有效等价类取值的所有组合。组合个数是2 * 1 ...
  •  但是,DRS是封闭的,这些权重指标都无法配置,一个简单的例子:如果在晚上很短的时间内,CPU的负载突然增高,这并不意味着我们需要将虚拟机迁移到另一台宿主机之上,或者如果管理员知道在未来一段时间将会虚拟机...
  • 2021DIY电脑配置入门篇(包含各cpu显卡天梯图对比

    万次阅读 多人点赞 2021-06-19 09:45:55
    核心配置 一般指CPU、主板、显卡三大件 例子,你预算5000元,那你可以花3500左右购买CPU+主板+显卡; 1.CPU的选择 处理器分为台式CPU和笔记本CPU,受技术限制,一般来说台式CPU的性能要远高于笔记本CPU,笔记本...
  • 文本相似度的方法对比

    千次阅读 2018-09-10 10:34:44
    正如开头我们的那个例子(harp和keyboard),语义相似度有好几种维度,句子可能在其中一种维度上相似,而在其他维度上有差异。目前的句子嵌入方法也只做到了表面。通常我们在皮尔森相关系数(Pearson correlation...
  • 灰度、亮度、对比度、饱和度

    千次阅读 2020-07-03 19:04:37
    1.灰度:图像中有黑色,白色,在黑色中加入白色就得到灰色; 2.灰度值:图像像素中有R、G、B三个值。使图像像素的R=G=B时,得到灰度图像,对应的值叫灰度值。...4.对比度:一幅图像中,最亮的白和最暗的黑之间,亮度

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,448
精华内容 49,779
热门标签
关键字:

对比举例子