精华内容
下载资源
问答
  • 2020-01-08 21:22:18
    • 介绍
      适配器是将两个不兼容的类融合在一起。例如,经常碰到要在两个没有关系的类型之间进行交互,第一个解决方案是修改各自类的接口,但是如果没有源代码或者我们不愿意为了一个应用而修改各自的接口,此时我们往往会使用一个Adapter,在这两种接口之间创建一个“混血儿”接口,这个Adapter会将这两个接口进行兼容,在不修改原代码的情况下满足需求。
    • 定义
      适配器模式把一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
    • 使用场景
      (1)系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。
      (2)需要一个统一的输出接口,而输入端的类型不可预知。
    • 适配器模式的类型

    (1)类适配器模式

    //Target角色
    public interface FiveVolt{
       public int getVolt5();
    }
    //需要被转换的对象
    public class Volt220{
       public int getVolt220(){
          return 220;
       }
    }
    //Adapter角色,将220V的电压转换成5V的电压
    public class VoltAdapter extends Volt220 implements FiveVolt{
       public int getVolt5(){
           return 5;
       }
    }
    public class Test{
       public static void main(String[] args){
          VoltAdapter adapter = new VoltAdapter();
          System.out.println("输出电压:"+adapter.getVolt5());
    }
    

    (2)对象适配器模式(优于类适配器模式)
    与类适配器模式一样,对象适配器模式把被适配的类的API转换成为目标类的API,与类适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类(被代理类),而是使用代理关系连接到Adaptee类。

    //Target角色
    public interface FiveVolt{
       public int getVolt5();
    }
    //需要被转换的对象
    public class Volt220{
       public int getVolt220(){
          return 220;
       }
    }
    //Adapter角色,将220V的电压转换成5V的电压
    public class VoltAdapter implements FiveVolt{
       Volt220 mVolt220;
    
       public VoltAdapter(Volt220 adaptee){
           mVolt220 =a daptee;
       }
    
       public int getVolt220(){
          mVolt220.getVolt220();
       }
    
       public int getVolt5(){
           return 5;
       }
    }
    public class Test{
       public static void main(String[] args){
          VoltAdapter adapter = new VoltAdapter();
          System.out.println("输出电压:"+adapter.getVolt5());
    }
    
    更多相关内容
  • 黑天鹅事件指的是某些不可预测的重大、稀有事件,一旦发生,就会带来意料之外的重大冲击,但是很多人经常对其视而不见。黑天鹅事件有分为正面黑天鹅事件和负面黑天鹅事件,我们当然希望自己尽量多被正面黑天鹅影响,...

    640?wx_fmt=jpeg

    本文阅读时间大约7分钟。


    最近两周读了一本书:《黑天鹅》,这本书前几年就遇到过,当时读了几页没理解,然后就没有下文了,再一次印证了阅读中的那个真理——阅读也是需要阅历的,再次阅读后,我将这本书视为对自己最重要的书。


    这本书主要分为三个部分:第一部分,塔勒布指出了黑天鹅这种现象,并提出了平均斯坦和极端斯坦的概念;第二部分,塔勒布列举了几个因没有意识到黑天鹅现象而导致的认知谬误;第三部分,塔勒布给出了自己应对黑天鹅的决策规则和方法。


    认识黑天鹅现象


    历史的跳跃性

    历史和社会不是缓慢爬行的,而是一步步地跳跃,它们从一个断层跃上另一个断层回想自己的生活,在哪里上大学、大学毕业后做什么、要在哪个公司工作、要在哪里定居等重大问题,起始都不是按照计划(原本也没有什么计划)进行的。

    想想历史上的一些重大发现(发明),人们原本是在寻找别的目标,碰巧遇到了这个目标。


    • 青霉素的发现,青霉素的发现是极其偶然的。弗莱明曾从病人的脓中提取了葡萄球菌,放在盛有果子冻的玻璃器皿中培养,繁殖起来的金黄色葡萄球菌——他称为“金妖精”,密密麻麻地出现在果子冻上。这“金妖精”使人生疖、长痈、患骨髓炎,引起食物中毒,很难对付。他培养它,就是为了找到能杀死它的方法,某一天,弗莱明发现一些培养皿受到了污染而发霉了,一般而言,对于这种发霉的培养皿都是一倒了之,但是弗莱明想搞清楚是什么污染了培养皿,于是拿起培养皿仔细观察,然后他发现了一个了不得的现象:在青绿色的霉花周围出现一圈空白——原来生长旺盛的“金妖精”不见了。

    • 计算机的发明和应用是随机的,最开始设计计算机的人目标是为了计算导弹轨迹,他们会计划将计算机应用到现在这种万物互联的地步吗?

    • 宇宙大爆炸的证据——宇宙微波背景辐射的发现,上世纪70年代的时候,贝尔实验室的两位无线电工程师在一个非常巧合情况下,想做无线电实验,但总是有稳定的背景噪声存在,他们百思不得其解,甚至为此清理了实验室里面鸽子窝,但发现噪声还是存在。最终他们找到了美国普利斯顿大学的几位教授,因此发现了宇宙微波背景辐射。


    平均斯坦和极端斯坦

    作者提出了两个概念:平均斯坦和极端斯坦,用来将生活、社会中的一些事情一分为二。我感觉翻译是在中文里生造的这两个词,要区分平均斯坦和极端斯坦,关键点在于:个体是否能够对群体产生不成比例的影响。


    按照上面哪个规则,大部分时候可以清楚得将一个事情归类到平均斯坦或极端斯坦,这里再举几个例子。


    • 属于平均斯坦的问题:高度、重量、身高、赌博收入、小餐馆老板、建筑工人的收入、公务员的收入(不包括灰色收入?)、车祸、死亡率、智商等。

    • 属于极端斯坦的问题:财富、收入、单个作者的图书销售量、名人知名度、Google搜索量、公众号的粉丝量、名人影响力、每个语言的使用人数、地震造成的损失、战争死亡人数、公司规模、股票持有比例、金融市场、商品价格、通货膨胀率等。


    黑天鹅事件

    黑天鹅事件指的是某些不可预测的重大、稀有事件,一旦发生,就会带来意料之外的重大冲击,但是很多人经常对其视而不见。黑天鹅事件有分为正面黑天鹅事件和负面黑天鹅事件,我们当然希望自己尽量多被正面黑天鹅影响,少被负面黑天鹅影响。


    大部分黑天鹅事件发生在极端斯坦,但是不要简化为“所有黑天鹅事件都发生在极端斯坦”。


    常见的认知谬误


    过去的经验的局限性

    某件事情1000天的历史,并不会告诉你第1001天的任何信息。作者在这里讲了“农场里的火鸡?”这个故事,以火鸡的视角,从第1天开始到第1000天,每天的固定时刻都会有食物送来,按照它的经验,它所处的环境是稳定的、安全的,但是第1001天的时候,送来的并不是食物,而是登上别人餐桌的结果。


    叙述谬误

    叙述性谬误是指我们无法在不编造理由或强加一种逻辑关系的情况下陈述一系列事实。面对过去发生的事情,我们总喜欢总结出一系列的因果关系,但实际上这种总结会让我们以为自己更好得理解了过去,但实际却丢失了很多真实的信息。


    产生叙述性谬误的原因是:信息本身的特性决定了只有被简化、被总结过的信息才有可能被传播得更远、更久。


    沉默的证据

    进化是一系列侥幸的成功,有好的,也有很多不好的,你只看到了好的,然而在短期内,哪些对你是真正好的并不明显。

    2000多年前,罗马雄辩家、文学作家西塞罗讲了下面这个故事:有人把一幅画给一位无神论者看,画上画着一群正在祈祷的拜神者,他们在随后的沉船事故中幸存了下来,其寓意在于说明祈祷能保护人们不被淹死。无神论者问:“那些祈祷后被淹死的人画在哪里?”这个现象我们有时候还称之为“幸存者偏差”。

    再看几个类似的案例

    • 参与赌博的新手运气通常不错——废话,那些运气不好的在玩几把之后就不玩了,后面也就算不得赌徒,而留下来的都是那些运气好的;

    • 我们在日常维护IT系统的稳定性的时候,通常会关注很多系统监控指标,通过这些指标来证明自己系统的稳定性,但是那些没有被监控到的点才可能在某一天产生重大的危害;

    • 我们自己本身的存在就是低概率的事件,但是我们经常忘记这一点,以为一切都是天经地义的。


    游戏谬误

    如果你是钟表修理匠,脑外科医生或棋手,注意力集中是一种好品质。但是对待不确定问题时,你最不需要做的就是“集中”(你应该让不确定性集中,而不是让自己集中)。


    这个问题是我最喜欢的一个问题,他指出了我们生活中常见的一种现象——在学校的学霸最后却一事无成,学业落后的人却在赚大钱,甚至获得某个学科的大奖。【PS:从整体上来看,学霸们的平均收入还是高于学渣的,但是在收入这个问题上,讨论平均收入没有任何意义】


    现实生活是充满了不确定性的,学校中的学习和考试都是简化过的考验,如果我们以应对学校考试的那种方法去面对现实生活,就会很大概率上被生活教育。以学习历史举个例子,我在中学学习历史的时候,就是简单得去记忆和背诵哪一年发生了什么事,考试考卷也是按照这个模式考察,即使是最后的思考题,通常也是有固定套路的。但是学习历史最有价值的部分却被忽视了:培养自己的思考能力——时间的长度和角度的广度。


    我们该如何应对


    读这本书前面的时候一直在想:老哥,你说得都对,但是我该怎么应对呢?作者给出了一个简单的决策规则:面对正面黑天鹅不需要保守,面对负面黑天鹅要保持警惕。


    蔑视命运,不要去追赶列车——错过列车,只有在你追赶它的时候才是痛苦的!你应该有自己的节奏和选择,而不是随波逐流。


    不要为生活中的琐事烦恼,因为你自己本身就是黑天鹅。



    640

    《重构》阅读笔记-代码的坏味道

    我们为什么要要工作?

    再谈源码阅读

    与人交往的内核

     你再主动一点点 640?  我们就有故事了

    本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。

    640

    扫码关注

    有趣的灵魂在等你

    640?wx_fmt=jpeg 640 640在看点这里 640
    展开全文
  • 这篇文章讨论了一个非常重要的上层问题——模型的正确性与模型的预测性的问题。

    Is Artificial Intelligence Permanently Inscrutable?

    Despite new biology-like tools, some insist interpretation is impossible.

    BY AARON M. BORNSTEIN
    ILLUSTRATION BY EMMANUEL POLANCO
    SEPTEMBER 1, 2016

    【原文链接】这篇文章讨论了一个非常重要的上层问题——模型的正确性与模型的可预测性的问题。

    人工智能将永远不可理解吗?

    尽管有了新的类生物的工具,一些人依然认为解释是不可能的

    作为IBM的研究科学家,Malioutov花费了部分时间来建立机器学习系统,为IBM公司的客户解决面临的难题。 其中一个项目是的客户是一个大型保险公司。 这是一项艰巨的任务,需要复杂的算法。 当给他的客户描述结果时,他有些犯难。 ”我们无法向他们解释模型,因为他们没有机器学习方面的基础。”

    事实上,即使客户是机器学习专家可能也没有办法。 那是因为这个模型是一个人工神经网络,一个可以接收给定类型的数据 —— 在这个案例中,是保险公司的客户记录 —— 并且找到它们之中的模式的程序。 这些网络已经实际使用了半个多世纪,而最近他们从语音识别和语言翻译到下围棋的机器人和自动驾驶汽车的种种突破中看到了再度兴起的迹象。

    这里写图片描述
    隐层意义:在神经网络中,数据从一层传递到另一层,在每一步都经历简单的转换。 在输入层和输出层之间是隐层,节点组和连接,通常在没有任何人为干预的模式下工作,而且与输入或输出没有明显连接。 “深度”网络是具有许多隐层的网络。

    尽管取得的成功令人兴奋,但是现代神经网络有一个令人不安的事实:没有人知道他们如何工作。这意味着无法预测什么时候可能会失败。

    比如说,机器学习研究员Rich Caruana及其同事最近报道的一则故事:匹兹堡大学医学中心的一个团队正在使用机器学习来预测肺炎患者发生严重并发症的可能性。该团队尝试了几种不同的方法,希望在患者出现并发症的风险较低的情况下进行门诊治疗,把医院病床和医护人员的关注留给更需要的病人。尝试的方法包括各种神经网络,以及软件生成的能产生清晰可读的规则的决策树。

    神经网络是最经常使用的方法。但是当研究人员和医生查阅神经网络给出的规则时,他们注意到一些令人不安的事情:尽管哮喘患者被认为极易发生并发症,但是一项规则指示医生让已经患有哮喘的肺炎患者回家。

    该模型做了该做的事情:发现数据中的模式规律。它产生的糟糕建议是数据巧合的结果。医院的政策是让哮喘患者接受重症监护,而这项政策执行得很好,哮喘患者几乎从未发生严重并发症。若没有医院的额外的关心,结果可能就完全不同。

    医院轶事让人们认清可解释性的实际价值。 “如果基于规则的系统已经知道哮喘的风险降低了,神经网络肯定也学到了这一点,”Caruana及其同事写道——但神经网络并不是人类可解释的,关于哮喘患者的奇怪结论也可能很难断定。如果模型不可解释,Malioutov警告说:“你可能会不小心让人死掉。”

    这就是为什么这么多人不愿意赌神经网络的神秘是准确的。当Malioutov向他自己的公司客户介绍他准确但不可思议的神经网络模型时,他还向他们提供了一种替代的模型,基于规则的模型,其工作方式可以他简单地说明。虽然后者可解释的模型不如前者那么准确,但客户决定使用它,尽管它是一个数学上老练的保险公司,每百分之一的准确度对于他们都很重要。 “他们可以与更多的关系,”Malioutov说。 “他们非常重视直觉。”

    甚至政府也开始关注不可思议的神经网络神话产生越来越多的影响。欧盟最近提出建立“解释权”,允许公民要求算法决定的透明性。然而,立法者没有明确指出“透明性”是什么意思。尚不清楚这个遗漏是由于对这个问题的无知还是对它的复杂性的理解。

    一些研究人员希望可以不去选择——让我们既拥有多层次的蛋糕(神经网络),也可以理解它。

    一些人认为这样的定义可能是不可能达到的。目前,虽然我们可以完全知道有关神经网络正在做什么——毕竟,它们只是计算机程序——我们却很难理解它们如何或为什么要这样做。网络由许多(有时甚至数百万)个单元组成,称为神经元。每个神经元将许多数值输入转换为单个数字输出,然后传递给一个或多个其他神经元。像大脑一样,这些神经元被划分为很多“层”,每一单元组从其下面的层获取输入,将输出发送到上面的层。

    通过馈送数据来训练神经网络,然后调整层之间的连接,直到网络的计算输出与已知输出(通常由类别组成)匹配为止。过去几年的令人难以置信的结果归功于一系列新技术,可以快速训练在第一个输入和最终输出之间有很多层的深层网络。一个流行的深层网络叫做 AlexNet,用于对照片进行分类——根据它们是包含一只西施犬还是一只博美犬这样的细微区别进行标记。它由超过6000万的“权重系数”组成,一个权值“每个神经元”告诉一个神经元对每个输入的关注度是多少。Cornell大学和Geometric Intelligence公司的计算机科学家 Jason Yosinski 说:“你若想网络有所理解,你必须对这6000万个数字有所理解。”

    即使有可能强加这种可解释性,也并不总是可取的。对于可解释性的要求可以被看作是另外一套约束,阻止了一个模型只关注给定的输入和输出数据获得的“纯粹的”解,并且潜在地降低了准确性。在今年年初的DARPA会议上,项目经理David Gunning用下图总结了一种权衡,图中显示深度网络是现代方法中最不可理解的。在谱的另一端的决策树是以规则为基础的系统,过分重视可解释性。
    这里写图片描述
    什么VS. 为什么:现代学习算法显示出人类可解释性及其准确性之间的权衡。 深度学习既是最准确的,也是最不可解释的。

    结果是现代机器学习提供了神话之间的选择:我们是想准确地知道会发生什么,还是牺牲精确度去了解为什么会发生什么事情? “为什么”可以帮助我们策划、调整,并了解我们的模型何时会崩溃。 “什么”可以帮助我们在不久的将来适当地行事。

    这可能是一个困难的选择。但是一些研究人员希望不需要选择——允许我们既能拥有多层次的蛋糕,又可以理解它。令人惊讶的是,一些最有希望的研究方法将神经网络作为实验对象——以生物科学的方式启发他们开始——而不是分析纯粹的数学对象。例如,Yosinski说,他正在努力了解深层次的网络,“我们了解动物,甚至是人类”。他和其他计算机科学家正在从神经科学家眼中的对等网络的生物研究获取技术进入大脑:探索单个的组件,编制他们的内部结构如何响应输入的小变化,甚至删除一部分看其他部分如何补偿。

    科学家已经从零开始构建了新的智慧,现在正在把它分开,将这些虚拟生物应用到显微镜和手术刀的数字等效物上。

    Yosinski坐在一个电脑前,谈到网络摄像头。 网络摄像头的数据被馈送到一个深层神经网络,而网络本身正在使用软件工具包Yosinski和他的同事开发的称为深可视化工具包的实时分析。 点击几个屏幕,Yosinski放大网络中的一个神经元。 他说:“这个神经元似乎对面孔有反应,”他在互动的视频记录中说。人类的大脑也被称为具有这样的神经元,其中许多人集中在大脑的一个称为梭形面部区域的区域。 这个地区在1992年开始的多项研究中发现,已成为人类神经科学中最可靠的观察之一。 但是那些研究需要像正电子发射断层扫描这样的先进技术,Yosinski可以通过代码单独处理他的人造神经元。

    这里写图片描述
    脑活动:深层神经网络中的单个神经元(由绿色框突出显示)对Yosinski的脸部作出反应,正如人类大脑的不同部分可靠地响应面部(以黄色突出显示)。

    这种方法让他将某些人造神经元映射到人类可理解的想法或对象,如面部,这可以帮助将神经网络变成直观的工具。他的节目还可以强调图片的哪些方面对于刺激面神经元来说是最重要的。 “我们可以看到,如果我们眼睛更黑,嘴唇更红润,它会更加强烈地反应,”他说。

    杜克大学计算机科学与电气与计算机工程系教授辛西娅·鲁丁(Cynthia Rudin)认为,这些“事后”的解释本身就是一个问题。她的研究重点是建立适用于监狱判刑和医疗诊断等领域的基于规则的机器学习系统,人类可读解释是可能的,而且至关重要。但是对于像视觉这样的领域的问题,她说:“解释完全在旁观者的眼中。”我们可以通过识别一个面神经元来简化网络响应,但是我们如何才能确定真正的目标? Rudin的关注回应了著名的言论,视觉系统本身可能没有更简单的视觉系统模型。她说:“你可以对复杂的模式做许多种解释。” “你只是选择你想要的”对吗?

    Yosinski的工具包可以通过后向处理在一定程度上解释这些问题,发现网络本身“想要的”是正确的 —— 一种人工的理想概念。该程序以原始静态开始,然后逐个调整,使用与训练网络的过程相反的方式修改图像。最终,它找到一个引发给定神经元的最大可能响应的图片。当这种方法应用于AlexNet神经元时,它产生的画像无可非议地唤起了标记的类别,尽管像幽灵一样。

    这里写图片描述
    理想的猫:由Deep Visualization工具包生成的合成理想猫脸的示例。 这些面是通过逐个调整一般的起始图像来生成的,直到实现了AlexNet的面神经元的最大响应。

    这似乎支持他的观点,在一些非常普遍的意义上,面部神经元确实在寻找面孔。但有一点,Yosinski的过程依赖于统计约束(称为自然图像先验)生成这些图片。这些先验信息将其限制为产生符合真实世界对象图片中发现的各种结构的图像。当他删除这些规则时,该工具包仍然会以最大的可信度来标注图像,但该图像是纯静态的。事实上,Yosinski已经表明,在许多情况下,引起AlexNet神经元兴奋的大部分图像对人类来说都是静态的。他很轻易地认可,“很容易弄清楚如何让网络给出一些极端的东西。”

    为了避免这些陷阱,弗吉尼亚理工学院电气和计算机工程助理教授Dhruv Batra采用更高层次的实验方法来解释深层网络。他试图在内部结构中找到模式 ——“比我更聪明的人已经在这方面做出努力,”他解释说——他探讨了网络的运作方式,本质上是机器人眼睛跟踪版本。他的小组在由研究生Abhishek Das和Harsh Agrawal领导的项目中提出了一个关于图像的深度网络问题,比如判断在一个房间的给定图片中是否有窗帘上的窗帘。与AlexNet或类似的系统不同,Das的网络旨在一次只关注一小部分图像。它将虚拟的眼睛移动到图片周围,直到它确定有足够的信息来回答这个问题。经过充分的培训,深层网络表现非常出色,回答的准确率达到人类的最高水平。

    训练好的机器非常适合他们的环境,但不适应任何其他的

    Das,Batra和他们的同事们尝试通过调查图片中选择的位置来了解网络的决策方式。他们发现什么令他们惊讶:当回答关于窗帘的问题时,网络甚至不打算找窗户。相反,它首先看图像的底部,而且如果它找到一张床就停止寻找。看来,在用于训练这个神经网络的数据集中,可以在卧室中找到带窗帘的窗户。

    虽然这种方法确实揭示了深层网络的一些内在工作,但它也加强了可解释性提出的挑战。 “什么机器拾起来的并不是世界的事实,”Batra说。 “它们是关于数据集的事实”。机器完全按照它们被馈送的数据调整,使得很难提取关于它们如何工作的一般规则。更重要的是,他警告说,如果你不知道它是如何工作的,你不知道它会如何失败。

    像Yosinski和Batra这样的研究人员面临的一些障碍,对于研究人类大脑的科学家将会很熟悉。例如,对神经影像学的解释的问题在今天是普通的,如果不常见的话。认知神经科学家玛莎·法拉尔(Martha Farah)在2014年对该领域的回顾中写道:“担心的是,[功能性大脑]图像中,研究者创造的比研究者观察的更多。”这些问题在智能系统的非常不同的实现中的出现表明他们可能是障碍,不是研究这种或那种大脑,而是对智力本身的研究。

    追求诠释性是愚蠢的事情吗?在加利福尼亚大学圣地亚哥分校的Zachary Lipton的2015年博客文章题为“模拟解释的神话”中,提出了解释神经网络的动机的批判性观点,以及构建可解释机器学习模型的价值数据集在第一位。他在今年的国际机器学习会议(ICML)上向人类可解释性研讨会提交了一篇关于这个问题的引起争论的论文。

    Lipton指出,许多学者对可解释性的概念不同意,这表明他的解释性很少被理解——或者有许多同样有效的含义。在任何一种情况下,追逐可解释性可能不能满足我们对简单英文描述神经网络输出的期望。Lipton在他的博客文章中说,当涉及到巨大的数据集时,研究人员可以选择抵制解释的冲动,而不是“放心实践成功”。他认为,这个领域的目的之一是“建立可以从更多特征中学习的模型,比人类自认为可以解释的特征更多”,而可解释性可能会使这些模型不能充分发挥其潜力。

    但这种能力既是有用的也是失败的:如果我们不了解网络输出是如何生成的,那么我们就不知道输入的哪些方面是必要的,甚至不知道什么可以用于输入。案例:1996年,苏塞克斯大学的阿德里安·汤普森(Adrian Thompson)使用软件设计一个电路,采用类似于今天训练深度网络的技术。该电路执行一个简单的任务:区分两个音频音调。经过数千次迭代,调换和重新排列电路组件,软件发现几乎完美执行任务的配置。

    该电路使用的组件比任何人类工程师所使用的更少。不过,汤普森惊讶地发现,包括几个与其他物理连接的组件,然而电路仍然需要这些组件也正常工作。

    他去剖析电路。经过几次实验,他获悉,这个电路成功利用相邻部件之间的微小电磁干扰。断开的元件通过引起局部电场的小波动影响电路。人类工程师通常会防范这些相互干扰,因为它们是不可预知的。果然,当汤普森将相同的电路布局复制到另一批组件——或者改变了环境温度时,电路完全失效。

    电路展示了训练有素的机器的标志性特征:它们紧凑而简化,非常适合于他们的环境,但无法适应其他任何其他环境。他们使用工程师无法觉察的模式;但不知道这些模式在其他地方还适不适用。机器学习研究人员尽力避免这种称为“过度拟合”的现象,但随着这些算法在越来越多的动态情况下使用,它们的脆弱性将不可避免地暴露出来。

    对于普林斯顿大学计算机科学教授Sanjeev Arora,允许人们干预和调整网络是寻求可解释模型的主要动机。 Arora指出了两个可能在没有可解释性的情况下严重影响机器的功能的问题。一个是“可组合性”——当手头的任务涉及许多不同的决定(如围棋或自驾车)时,网络无法有效地学习哪些会引发错误。他说:“通常当我们设计事物时,我们先了解不同的组件,然后将它们放在一起。”这允许人们调整不适合给定环境的组件。

    需要保留可解释性的另一个问题是Arora称之为“领域适应性”——灵活地将一个环境中的知识应用于另一个环境的能力。这是一个人类学习者做得很好的任务,但机器可能会以令人惊讶的方式失败。 Arora描述了对于人类善于处理的那种微妙的语境变化,程序是如何糟糕地无法适应。例如,通过阅读正式文件(如维基百科)来训练解析人类语言的网络可能会完全不适用于在像Twitter这样含有更多的方言俗语的情形。

    按这种观点,可解释性似乎至关重要。但是我们明白我们用这个词的含义吗?开创性的计算机科学家马文·明斯基(Marvin Minsky)创造了“手提箱词语(suitcase word)”这个短语来描述许多术语——例如“意识(consciousness)”或“情感(emotion)”——我们在谈论自己的智慧时使用这些术语。他提出,这些词反映了许多不同的潜在的过程被锁在“手提箱”内。只要我们继续使用这些词指代更基础的概念,我们的见解就将受到我们的语言的限制。在人工智能研究中,可解释性本身可能是一个手提箱吗?

    虽然我谈到的许多研究人员乐观地认为,理论家们有一天将会解开手提箱,并发现一种统一的原则或定律来管理机器(或者是人类)的学习,就像牛顿的基本原理,也有些人警告说没理由对此保持期待。纽约市立大学哲学教授马西莫·皮布卢奇(Massimo Pigliucci)警告说,自然科学中的“理解”——以及人工智能的扩展——可能是路德维希·维特根斯坦(Ludwig Wittgenstein)按明斯基(Minsky)的期望所说的“集群概念”,可以允许有许多部分明确的定义。他说,如果这个领域的“理解”确实到来,可能不是来自物理学,而是进化生物学。他说,相比基本原理,我们认为更可能是物种起源。

    当然这并不意味着深度网络是一些新的自主生命的先兆。但是,他们可能会像生命一样难以理解。该领域逐渐增加的实验方法和事后解释可能不是在黑暗中的某种绝望感受,祈祷着理论发出光芒。相反,他们可能是我们唯一可以期望的光。可解释性可能会作为一组“物种”的原型示例零星地出现,这些原型示例由推理和依上下文具体情况而定的解释定义的分类法中组合而成。

    在ICML讲习班结束之际,一个小组的一些演讲者试图界定“可解释性”。每个人都有不同的观点。经过一番讨论,该小组似乎达成共识,即“简明”是模型可以解释的必要条件。但是,当界定简明时,该组再次产生分歧。 “最简明”的模型指的是什么呢?依赖于最少的特征?最明显的区别?最小的程序?讲习班没有讨论出统一的答案。

    正如马利乌托夫(Malioutov )所说,“简明不是那么简单”。

    展开全文
  • 2.1程序执行 2.1.1前趋图 2.1.2程序顺序执行 1.程序的顺序执行 2.程序顺序执行时特征:①顺序性:处理机严格按照程序所规定的顺序执行...③再现性:只要程序执行时的环境和初始条件相同,程序重复执行时,仍...

    2.1程序执行

    2.1.1前趋图

    2.1.2程序顺序执行

            1.程序的顺序执行

            2.程序顺序执行时特征:①顺序性:处理机严格按照程序所规定的顺序执行。

                                                   ②封闭性:程序运行时,独占全机资源,其执行结果不受外界影响。

                                                   ③可再现性:只要程序执行时的环境和初始条件相同,程序重复执行时,仍可得到相同的结果。

    2.1.3程序并发执行

    程序顺序执行时,cpu等资源的利用率低,引入多道程序技术后,使程序间能并发执行。只有不存在前趋关系的程序之间才可以并发执行。

            1.程序的并发执行:内存中有多道程序,由调度程序利用cpu空闲时间执行其中某个程序。宏观上来看,这些程序在一段时间内同时执行。

            2.程序并发执行时的特征:

             (1)间断性:由于它们共享系统资源或者合作地完成某一任务,导致程序的执行断断续续。               (2)失去封闭性:程序不再独占全部资源,其执行结果会受到资源的影响。                                       (3)不可再现性:失去了封闭性也就失去了,不可再现性。资源的状态受到其他程序的影响,必然导致执行结果的不一致。

    2.2进程的描述

    2.2.1进程的定义和特征

            1.进程的定义:多道程序环境下,程序是并发执行,但失去封闭性,有间断性,运行结果不可再现性,由此通常的程序是不能参与并发执行的。为了对并发的程序加以描述和控制,便引入了进程的概念。为了使参与并发执行的每个程序能独立运行,操作系统必须为进程配置一个数据结构,进程控制块(Process Control Block,PCB)进而控制和管理进程。系统用PCB描述进程的基本情况和活动过程。程序段+数据+PCB = 进程实体。创建进程就是创建PCB,撤销进程就是撤销PCB.

            2.进程的特征:

                    (1)动态性:进程的实质是进程实体的执行过程。“由创建而产生,由调度而执行,由撤销而消亡”。程序只是一组有序的指令的集合,并存放于某种介质上,没有活动意义,是静态的。                      (2)并发性:多个进程实体同时在内存中,一段时间内可以同时执行这些进程,而程序没有PCB不能参与执行。                                                                                                                                        (3)独立性:指进程实体是一个能独立运行、独立获得资源和独立接收调度的基本单位。                  (4)异步性:指进程是按异步方式运行的,按各自独立的、不可预知的速度向前推进。正因如此,才导致了传统意义上并发执行的程序其结果不可再现性。这样的进程需要配置同步机制。

    2.2.2进程的基本状态及转换

    进程共享系统资源,所以其执行期间难免的需要停下来等资源的分配。致使呈现间断性运行,所以进程在其声明周期内会有多种状态。

            1.进程的三种基本状态:

                    (1)就绪状态:进程已经分配到除了CPU以外的所有资源,获得cpu的控制权后就可以直接执行了。一般将该进程放置于就绪队列中                                                                                                      (2)执行状态:表示进程已经获得了CPU,正在执行中。                                                                (3)阻塞状态:正在运行的进程,由于发生了某事件而不能继续执行。此时OS会将处理机分配给另一个处于就绪状态的进程。受阻的进程就处于暂停状态,加入到阻塞队列中。

            2.三种基本状态的转换

            3.创建状态和终止状态:为了满足进程控制块对数据操作的完整性要求,通常又在操作系统中为进程引入了创建状态和终止状态。

            (1)创建状态:创建进程的大致过程,申请空白PCB,向PCB填入用于控制和管理进程的信息,分配运行时所需要的资源,将其插入就绪队列。如果因为内存不够,而无法创建进程,此时进程就处于创建状态,不能被调度执行。                                                                                                      (2)终止状态:当进程终结时就处于终止状态,操作系统中仍然保留一个记录,待其他进程提取完后再清空PCB,归还操作系统。

    2.2.3挂起操作和进程状态的转换

    挂起之后的进程,将不再被调度。对应的操作是激活操作。

            1.挂起操作的引入

                    (1)用户需要 (2)父进程请求 (3)负荷调节的需要 (4)操作系统的需要

            2.引入挂起原语操作后三个进程状态的转换

                    (1)活动就绪->静止就绪,对就绪状态的进程使用suspend原语,将不再接受调度

                    (2)活动阻塞->静止阻塞,对阻塞状态的进程使用suspend原语,待该进程期待的事件到来后从静止阻塞变成静止就绪。

                    (3)静止就绪->活动就绪,对静止就绪的进程使用active原语。

                    (4)静止阻塞->活动阻塞,对静止阻塞的进程使用active原语。

            3.引入挂起操作后五个进程状态的转换

                    (1)NULL->创建

                    (2)创建->活动就绪

                    (3)创建->静止就绪

                    (4)执行->终止

    2.2.4进程管理中的数据结构

            为了使计算机中各类资源方便进行管理和使用,OS将其抽象为各种数据结构和相应的操作。

            1.操作系统中用于管理控制的数据结构。

                    OS中,用进程信息表表征其实体。其中包含了资源或进程的信息以及指针,通过指针,可以将同类型的资源或者进程信息表划分成不同的队列,方便系统查找。一般分为四类:内存映射成内存表,以此类推还有设备表、文件表、进程表。通常进程表又被称为进程控制块PCB。

            2.进程控制块PCB的作用

                    (1)作为独立运行基本单位的标志,系统通过PCB感知进程的存在。

                    (2)能实现间断性运行方式,进程因阻塞而暂停时,需要保留CPU的现场信息,以供下一次的调度使用。传统的并发执行的程序不具有保护现场信息的功能,从而失去运行意义。

                    (3)提供进程管理所需要的信息,PCB中的资源清单保存里该进程所需要的全部资源,OS总是根据PCB实施对进程的控制和管理。

                    (4)提供进程调度信息,只有处于就绪状态的进程在能被调度执行。

                    (5)实现与其他进程的同步与通信,采用信号量机制时,每个进程都要设置同步信号量。PCB中的通信区域和通信队列指针用于实现进程的通信。

            3.进程控制块(PCB)中的信息

                    进程标识符(外标识符创建者给出,内标识符就是进程号) 、处理机状态(即上下文) 、进程调度信息、进程控制信息

            4.进程控制块的组织方式

                    系统上会有成百上千个PCB,所以需要按一定的方式组织起来

                    (1)线性方式,将所有PCB组织在一张线性表里。这张表放在内存的指定位置。

                    (2)链接方式,将具有相同状态的PCB通过PCB中的链接字,链接成一个队列。

                    (3)索引方式,建立索引表。每个索引表的首地址,放在内存专用单元中。

    2.3进程控制    

    进程控制(创建、撤销、调度、状态转换)一般是由OS内核中的原语来实现的。

    2.3.1操作系统内核

    现代操作系统一般将OS划分成若干层次,通常将与硬件紧密相关的模块(中断处理程序)、常用的设备驱动程序以及运行频率较高的模块(时钟管理、进程调度等)放在紧靠硬件的软件层次中,通常称之为内核。这样可以对软件进行保护和提高OS运行效率。处理机的执行状态分为两种,系统态和用户态。系统态可以执行一切指令。应用程序只能在用户态下运行。

            1.支撑功能:中断处理、时钟管理和原语操作。

            2.资源管理功能:进程管理、存储器管理、设备管理

    2.3.2进程的创建

            1.进程的结构层次(windows系统中不存在此概念,所有进程地位等同)

                    允许一个进程创建另一个进程,称为父子进程。子进程可以继承父进程的所有资源,父进程消亡后子进程也随之跟着消亡。在PCB中设置了家族关系表项,进程不能拒绝其子进程的继承权。

            2.进程图

            3.引起创建进程的事件:用户登陆(登陆成功后,系统将为该用户建立一个进程),作业调度,提供服务(用户需要打印服务,就创建打印进程),应用请求(分别建立输入进程和输出进程)。

            4.进程的创建

                    (1)申请空白PCB

                    (2)为新进程分配资源

                    (3)初始化PCB(标识信息,处理机状态信息,处理机控制信息)

                    (4)如果满足条件,则插入就绪队列

    2.3.3进程的终止

            1.引起进程终止的事件:

                    (1)正常结束(Halt指令或者Logs off指令)

                    (2)异常结束(越界,非法指令,保护错,算数运算错)

                    (3)外界干预(操作员或者操作系统,父进程请求,因父进程终止)

            2.进程的终止过程

                    (1)根据被终止进程的标识符,检索出PCB,读出进程状态。

                    (2)若该进程正在执行,则终止执行,并置调度标志为真,用于指示应当调度下一个进程

                    (3)若有子孙进程,则终止所有子孙进程。

                    (4)将资源还给父进程或者操作系统

                    (5)将被终止进程PCB从所在队列中移除,等其他程序来收集信息

    2.3.4进程的阻塞和唤醒

            1.引起进程阻塞和唤醒的事件

                    (1)向系统请求资源失败

                    (2)等待某种操作完成(等待I/O)

                    (3)新数据尚未到达(多个进程合作完成某任务)

                    (4)等待新任务到达(网络OS中,没有新数据包需要发送)

            2.进程阻塞过程

                    阻塞是进程的一个主动行为,如果发生了上述的某事件,进程会自主吊用block原语将自己阻塞。将PCB插入阻塞队列

            3.进程唤醒过程

                    当处于阻塞状态的进程所期待的事情发生后,则有关进程(期待谁,谁发)会吊用wakeup原语唤醒进程。将被唤醒的进程从阻塞队列中移除,将其PCB状态改为就绪,插入就绪队列。(block 和wakeup应当是成对出现的)

    2.3.5进程的挂起与激活

            1.进程的挂起

                    挂起的事件发生后,OS调用suspend原语将进程挂起。若被挂起的进程处于活动就绪态就改为静止就绪,若是活动阻塞就改为静止阻塞。若正在执行,就转向调度程序,重新调度就绪队列中的其他程序。

            2.进程的激活

                    发生激活的事件时,OS调用激活原语active,将进程从外存掉入内存,检查状态,再改状态,插入相应的队列。

    2.4进程同步(单处理机)

    2.4.1进程同步的基本概念

            为了使并发执行的进程间能按照一定规则共享系统资源和能很好地相互合作。

            1.两种形式的制约关系

                    (1)间接制约:对于临界资源的访问

                    (2)直接制约:多个进程合作完成某任务,有先后次序要求。

            2.临界资源(Critical Resource)

                    “消费者生产者的问题”,由于进程的并发执行。可能在执行某代码时发生中断,转向去执行另一段代码,后过头来再执行该代码。导致了数据不一致,从而产生错误。

            3.临界区(Critical Section)

                    硬件资源和软件(内存)资源,统称为临界区。

            4.同步机制应当遵循的规则

                    (1)空闲让进 (2)忙则等待 (3)有限等待 (4)让权等待

    2.4.2硬件同步机制

    软件实现互斥访问有一定难度,目前计算机提供了一些特殊的硬件指令,可以利用这些特殊的指令来解决临界区的问题。

            1.关中断

                    进入临界区后,关闭中断处理程序,从而不引发调度。

            2.利用Test-and-Set指令实现互斥(原语,执行过程中不可中断)

                    TS指令管理临界区时,为每个临界资源设置一个布尔变量lock,为FALSE时表示资源没上锁。进程申请临界资源时,需要先用TS指令对其测试资源是否可用,可用的话将TRUE赋值给lock。检查和上锁,一气呵成,不可中断。

            3.Swap指令实现进程互斥

                    Key初值为TRUE,用于和全局bool变量lock交换值。

    2.4.3信号量机制(编写程序困难,易出错)

            1.整型信号量

                    把整型信号量定义为一个用于表示资源数目的整型量S,仅能通过两个标准的原子操作wait(S)和signal(S)来访问。S>0时,才能获得资源。两个原语,执行过程不可中断。

            2.记录型信号量

                    采用了记录型的数据结构而得名,有代表资源数量的value还有进程链表指针list    wait(S)中,当value小于0时,会自我阻塞。signal(S)中,当value++后value还是小于等于0的,那么说明还有进程在阻塞,应当唤醒进程。

            3.AND型信号量

                    将进程运行过程中所需要的资源一次性分配,使用完后再一次释放。Swait(Simultaneous wait)

            4.信号量集

                    上述三种操作,都只能对资源进行+1,-1。一次申请N个单位时,便需要N次操作。

    Swait(S1,t1,d1,S2,t2,d2,......,Sn,tn,dn),其中S表示临界资源,t1表示最少需要量,d1表示实际需要量。d1>=t1,若S1<t1,则不予分配。Swait(S,1,0)只测试资源,不占用,相当于一个可控开关。

    2.4.4 信号量的应用

            1.利用信号量实现进程互斥

                    为某一资源设置互斥信号量mutex,初始值为1,表示没有进程使用该资源。

    若mutex=0,表示有一个进程在使用该资源,另一个必须等待挂入阻塞队列。

    若mutex=-1,表示有一个进程在使用临界资源,还有一个在等待。

    某进程想使用临界区前应当用wait(mutex)打探下临界区的情况,正在临界区内运行的进程退出时需要唤醒,阻塞的进程,使用signal(mutex)。

            2.利用信号量实现前趋关系

                    A进程必须在B进程前面执行,那么需要达到这一点就需要设置两个互斥量

    mutexA=0,mutexB=1。

    A{wait(mutexB);......;signal(mutexA))};

    B{wait(mutexA);......;signal(mutexB))}

    2.4.5管程机制(java里的synchronized关键字互斥锁)                

            1.管程的定义

                    一种进程同步工具,进程对共享资源的访问必须先通过管程。确保每次进入管程的只有一个进程。由管程名、局部共享数据说明、操作、初始化语句

            2.条件变量

    2.5经典进程同步问题

    2.6进程通信

    2.6.1进程通信类型

            1.共享存储器系统(Shared-Memory-System)

                    (1)基于共享数据结构的通信方式

                    (2)基于共享存储区的通信方式

            2.管道(pipe)通信系统

                    利用pipe文件(内存)进行读写,只能实现半双工通信,要想全双工,发送和接收方需要分别设置两个pipe文件,用于接收和发送。

            3.消息传递系统(Message passing system)

                    (1)直接通信方式:利用OS的原语直接将消息发送到目标进程上

                    (2)间接通信方式:发送和接收进程通过共享中间实体(称之为邮箱),完成进程间的通信

            4.客户机-服务器系统

                    (1)套接字

                    (2)远程函数调用,RPC

    2.6.2消息传递通信的实现方式

            1.直接消息传递系统

                    直接通信原语send(receiver,message),receive(sender,message)

            2.信箱通信

                    进程之间的通信需要通过某种中间实体(共享数据结构)来完成                         

    2.6.3直接消息传递系统实例

            1.消息缓冲队列通信机制中的数据结构

            2.发送原语

            3.接收原语

    2.7线程(Thread)

    2.7.1线程的引入

            引入进程是为了程序能并发执行,那么引入线程是为了减少程序并发执行时所付出的开销。

            1.进程的两个基本属性:可独立拥有资源,可独立调度和分派。

            2.程序并发执行时所付出的时空开销

                    进程在创建、撤销、切换状态中,系统必须为之付出较大的开销(CPU环境)。

            3.线程作为调度和分派的基本单位

                    将进程的两个基本属性分开。

    2.7.2线程与进程的比较

            1.调度的基本单位

                    进程每次被调度时,都需要进行上下文切换,开销比较大。当线程切换时,仅需要保存和设置少量寄存器的内容。同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,必然会引起进程的切换。

            2.并发性

                    允许一个进程中的线程并发执行。

            3.拥有资源

                    进程是拥有资源的基本单位,线程本身不拥有系统资源。允许多个线程共享该进程所拥有的资源。

            4.独立性

                    独立性低,一个线程打开的文件,可以被另一个线程访问。

            5.系统开销

                    创建线程的开销低

            6.支持多处理机系统

                    传统的单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。但对于多线程进程,可以将线程分配到不同的处理机上,实现并行执行。

    2.7.3线程的状态和线程控制块

            1.线程运行时的三个状态

                    执行,就绪,阻塞

            2.线程控制块TCB

            3.多线程OS中的进程属性

                    (1)进程是可拥有独立资源的基本单位

                    (2)多个线程可并发执行

                    (3)进程已经不再是可执行的单位

    2.8线程的实现

    2.8.1线程的实现方式

            1.内核支持线程KST

                    所有线程的管理由核心完成,核心负责维护上下文,线程切换需要核心支持,以线程为单位分配处理机

            2.用户级线程ULT

                    线程的创建不经过内核,但以进程为单位分配处理机。所以即使是多线程的进程,也只能分配到一个处理机。

            3.组合方式

    2.8.2线程的实现

    2.8.3线程的创建和终止

    展开全文
  • 所有系统,包括滤波器,都是因果...这意味着它们不能在激励源激励之前对激励(不可预知)做出任何反应。那么,又该如何设计一款可“预测”的滤波器呢?好吧,这一切都取决于你对品质的期待有多高以及这一预测的相关性。
  • 适配器模式

    2018-11-19 19:41:27
    需要一个统一的输出接口,而输入端的类型不可预知。 4.适配器模式的UML类图 适配器模式也分为两种,即类适配器模式和对象适配器模式,首先学习类适配器模式,如图:  类适配器是通过接口以及继承...
  • 一个常见的错误观点是:如果我们喜欢做一件事,就可能把它做好。 有一条宗教信条是:工作应当是快乐的。它有多种形式,可能是一项要求、一种期待或者现代人事管理理论中的一个假设条件。毫无疑问,这听起来挺有...
  • 很多人有创业的想法,他们觉得自己的idea非常牛逼,如果投放到市场上,会立马有很多人蜂拥而至,并且抢着购买。实际的情况却是摊子铺得很大,用户却很少,因为和自己的预期相差太大,坚持了...
  • 社交模块可以拉近股票用户的距离,用户各自分享对股票的感知和看法,预知趋势,发表行业的见解等等。结合微信、微博等社交软件,把圈子定位为股票,用户自行发帖,对他人发表的动态进行评论、点赞、转发等功能。也...
  • 2020年,拥抱平凡

    2021-01-05 11:01:36
    2020年,拥抱平凡 前言: 这是一篇迟到的2020个人总结,前几年的总结都是12月31号完成的。现在是1月2号0:00我开始敲下了第一行字,原本应该20年12月31日完成的总结,我拖到了现在,预计1月3日24:00前完成。 正文...
  • 今年已过去大半,对于手机厂商来说,上半年的激战差不多落下帷幕,即将迎来下...事实上,5G确实是上半年机型爆发的一个契机,而到了下半年,对于安卓手机来说,除了处理器和摄像头的小幅度可预知的升级,也确实没...
  • 苹果发布会又要来了

    2021-09-10 01:04:04
    说实话,我还是挺期待的。不过借今天这个话题,想在这说几点关于乔布斯的内容。 也不是特别的内容,而是一些感慨,因为最近我们读书会刚花了一个月的时间,解读完《史蒂夫·乔布斯传》这本书。 这本书给我们呈现出...
  • 作为一项正在迅猛发展的技术,我们需要人工智能在给人们带来便利的同时也不破坏对人基本权利的尊重,更不能给人类带来不可预知的风险。在本文中,我们将重点讨论模型的公平性和可解释性的基本概念和方法。
  • 即:要求模板类的类声明和类实现要都放在头文件,而能分离。 本文就对模板的这个奇特习惯进行分析。 本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q4/20201230。 分离式...
  • 华为,作为以技术实力著称的传统电信设备商和系统集成商,一直是智慧城市市场上低调但又不可忽略的力量。从云到端,整个IoT数据链路的每个环节都离不开华为的设备产品。终端、芯片、5G、LoRa、NB-IoT……都有着决定...
  • 因为这是不可预测的,就像我们开头说到的,很多人在一幅画上作画,最终会画出什么来? 没人知道。 多个用户在你的产品上,产生的化学反应是很难预知的。 我们做产品的时候,要考虑群体,要有群体这个概念。 总结 ...
  • 本文作为多线程编程的第一篇文章,将从一个简单的例子开始,带你真正从代码层次理解什么是线程安全,以及为什么会出现线程安全的情况。文章中将提供一个完整的线程安全示例,希望你可以跟随文章,自己真正动手...
  • 前两年是DMP(数据管理平台)火了,这两年CDP(客户数据平台)火了,还有让人感觉“可远观不可亵玩”的数据中台也火了。但是赶着潮流上工具的,可能会惊慌发现,“车”都造好了,但似乎没有几个人会“开车”。 一种...
  • 使用了一段时间后,我发现电脑携带还是不是很方便,出行的时候,就能享受追剧的快乐了。 经过不懈的努力,我研究出了微型的电脑,我取名为手机。但是目前还面临着一个问题,那就是手机要充电,但是电源电压是220V...
  • 我是1976年出生在新疆,新疆的日照和高原气候,让我的身材像白杨一样挺拔,相貌虽敢说英俊非凡,但也让绝大多数人讨厌。我从小学习可以 说是优异的,大学考上了国家排名前5的重点大学,当时分配是98年,父亲...
  • 结合最新的机器人和人工智能技术,将最先进的教学方法应用于课程教学中是一位教师义不容辞的责任和义务,只有这样学生才对学习这个课程有兴趣有期待,唯有如此,这个课程才有未来,生生不息,欣欣向荣。 SLAM技术...
  • 当然,这个是组织分工带来的不可避免的问题,那么我们尽可能保证我们自己团队内部的服务的内聚性,围绕业务模块进行划分,保证微服务具有业务的独立性与完整性,尽可能少的存在服务依赖,链式调用。这里,又抛出了一...
  • [Python爬虫] 一、爬虫原理之HTTP和HTTPS的请求与响应

    万次阅读 多人点赞 2019-06-27 01:32:48
    如今越来越多的网络自动搜索工具出现,尤其是网络爬虫,为了做到更好地、流畅地网络搜索,用户代理信息是不可或缺的。 浏览器 就是互联网世界上公认被允许的身份,如果我们希望我们的爬虫程序更像一个真实用户,那...
  • 分布式系统的时间问题

    千次阅读 2020-02-14 19:12:02
    序一些技术点仿佛俯拾皆是,但很少有时间有精力把他们串起来形成体系,进而系统性地理解它们。象多人共著《深入分布式缓存》那样多角度认识缓存技术并多见,“临渊羡鱼,不如退而结网”,石头兄弟的...
  • 和我说的根本一样!这算完成了么?”为什么在产品开发的过程中总是容易出现定义和交付分歧呢?特别是甲方的产品,经常听到需求方说这个不对那个不是,作为产品经理又如何解决呢? 能真正的理解用户需求 这是...
  • 长久未曾发生改变的传统化妆品行业,也在这一趋势的影响下有了新的期待,塑造新期待愿景的,正是人类首款个性定制型化妆品——COSBALL。 传统的化妆品产业结构呈现着固定不变的特点,这种特点影响下,使得产业的发展...
  • A100可加速云端各种规模的、复杂的、不可预知的工作负载,包括纵向扩展AI训练和科学计算、横向扩展推理应用、实时对话式AI。 云端A100以突破性的性能为各种规模的工作负载提速。全新A2 VM实例系列可提供多级别性能...
  • 同时,一些核心链路的业务如无线收银台、扫一扫等,迫切需要与其他业务隔离,避免不可预知的突发流量影响到这些高保业务的可用性。因此,2016 年下半年开始建设和推广去中心化网关。 去中心化网关 去中心化网关将...
  • 窗外都市的霓虹灯还在闪烁,穿过立交桥的车辆已稀疏。原来,北京的夜也是这样的祥和与安静。... 独自面对一个全新的环境与场合,还有预知的未知挑战,她想或许也将会是你成长加速度的助跑器。
  • 《上瘾》学习总结

    2019-08-10 12:15:30
    不得承认,我们已经对手机上瘾了。 我们迫不及待的刷朋友圈、刷微博、玩游戏,原本只是打算用手机找个电话,结果一小时后却发现自己依然用手指在屏幕上滑动翻页。而且,这种刷手机的欲望有可能伴随了我们一天的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,128
精华内容 1,651
关键字:

不可预知的期待