【研一周小结】第八-九周个人学习总结

第八-九周学习总结 21-04-26

​ 由于每周的作业,主要是算法的证明题、HPC与论文写作的paper reading报告、以及VLSI的word复习,所以对应到课程学习上,会出现60%的课后时间在看两篇paper reading任务,40%精力跟上算法课的进度与作业,而HPC课程的textbook就没咋翻,VLSI更是处于薛定谔的迭代状态。这三周是期中考周,精力分配就更加有所倾斜了。

1 算法设计与分析

  • 第七周的授课内容主要是讲解了PSPACE问题,而PSPACE问题类似于NP问题:“NP问题”是研究一系列问题的时间代价,如果能解决了它以及相关的烦恼,那世界上就能少去很多很多复杂、卡时间的问题了——它有很多好理解的具体的例子,比如旅行商TSP问题,如3-SAT问题,再比如3-color染色问题等;“PSPACE问题”是研究一系列问题的空间代价,比NP问题还稍稍复杂一些,因为它的例子没那么多,而且还很复杂,最简单的例子是“双人决策博弈使得先手必胜问题”(我起的名呃)。因此PSPACE的证明就很不好理解。

  • 第八周课程学习了两部分内容:NPC问题的尝试转化解决(当然复杂度贼大),以及一类优化算法的介绍——local search

    • 第一部分的内容:NPC问题的尝试转化解决

      • 首先是一个简单的概念:NPC问题这么复杂,要想解决它,要么暴力(慢但是对),要么贪心(快但是局部最优),要么是启发式算法(快但不一定最优)
      • 课程以一个“最小点覆盖”的例子(等价最小边覆盖,一个NPC问题),分别用贪心法,DP法,以及转化成“最大流”问题进行尝试,各有各自的特点。
    • 第二部分,讲解local search,我觉得可以理解为“局部搜索”,我理解是在当前solution的附近探索别的可能的solution作为更优解的过程

      • 首先是gradient descent,注意:这是一个确定的算法,你跑几次跑出来结果是一样一样的。这个梯度下降和机器学习里的有点相似但不完全相同,机器学习的梯度下降是:俺当前的自变量x会往”最陡峭的下山方向跑过去“使得以最快的速度滑向附近的局部最优位置;算法课这里的梯度下降是,我首先选择一个”最大的“符合要求的solution方案(所以肯定不是最优的,但肯定是一个solution!),然后对我当前的solution进行微调,从而达到“相邻的”另一个“更好的”solution状态,这俩solution的关系叫做neighbor,所以呢我不断在相邻的neighbor里蹦蹦跳跳,最终我肯定能跳到一个局部最优的solution状态。可以发现,算法课里的gradient descent是更广义的梯度下降,也是贪心的思想,而最大的区别是,一定要注意①起点是最大符合的状态(最坏的solution);②每一个所谓的状态,前提得是一个solution,就是说你首先得是一个符合要求的solution才行,所以构建neighbor的时候你要看看你构建的neighbor是不是一个有效的解,随即交换搞出来的并不一定是解

        当然,这些很多时候只能拿到局部最优解。

        举个例子——对于“最小边覆盖问题”,我的起始solution状态是 S = V S=V S=V,其中 S S S表我选的点的集合——那这个式子表示我选了所有节点,那肯定覆盖所有边了呀,所以这是一个solution,但不是最优的solution。接下来,我每次减少一个或增加当前 S S S里的节点,当它依然满足“覆盖所有边时”就是一个neighbor。随着我在neighbor之间跳来跳去,S的点的数量肯定是减少,最后达到稳定,得到一个solution,但它可能是局部最优解——例如图是一个二重环,选的点是外面一圈,但是选内圈环的节点,点更少且满足“最小边覆盖”,但是gradient descent只能跑出外面一圈的点集合选法!

      • 第二是Metropolis算法,引入了概率的概念,具体是类比于自然界的熵变过程,引入一个衰减的温度 T T T,当温度高的时候,现实生活中的分子是会乱动的,所以算法中的solution在迭代过程中可以拥有更高的随机性去选择一个”差的“solution进行迭代,从而期望能够跳出最终的”局部最优解“的命运,实现抵达”全局最优“的港湾。其算法的改进版本,就是模拟退火Simulated Annealing算法,老朋友了,不赘述了。( ̄▽ ̄)"

      • Hopfield neural networks,解决方法是,每次都将不稳定的节点flip一下,直至系统稳定——我没完全理解,同时我很好奇难道不会出现一个死循环的状态跃迁序列吗?

      • 最大割问题。**贪心法:随机产生初始割,寻找一个”能使得割更大“的节点,把这个节点移到隔壁集合去。**又用gradient descent方法叙述了一下,然鹅没看懂…( ̄▽ ̄)"

      • 纳什均衡问题。在博弈过程中,如果出现”每个人都发现没有新的动作可以采取从而让自己更加受利“,那此时此刻,就叫做纳什均衡。所以纳什均衡有时候并不一定是所有人都利益最大化的情况(这种情况叫”社会最优“)。我们的问题是:寻找最好的纳什均衡与社会最优值的比。怎么求呢?目前还没理解完全…( ̄▽ ̄)"

  • 第九周学习内容是计算各类问题的low bounds以及随机算法

    • 第一部分内容,各类问题的low bounds
      • 这里的”low bounds“和算法复杂度的 Ω \Omega Ω,在这里,我们关心的是一类问题的low bounds,而不是某个具体算法的low bounds。也就是说,当我们讨论”排序问题“的low bound,我们说的在这类问题上,而不是什么冒泡排序、快排等算法。于是,这章我们学习了”归并俩数列“、”寻找最大值“、”寻找最大最小值“、”排序“、”决策树“等问题的low bound的证明过程。事实证明,还没有领悟此章精髓。
    • 第二部分是随机算法
      • 随机算法是老朋友了呀。引入随机算法的目的,我认为就是让在所有任意的输入序列上,让算法的综合性能能够实现均匀的、稳定的性能!
      • 一个典型的随机算法,就是蒙特卡洛算法。其最好理解的经典instance,就是用蒙特卡洛求面积:已知曲线方程 f ( X ) f(X) f(X),咋求此曲线面积?答:开1W个随机点,随机落在平面上,统计落在曲线图形内的点数,除一下总平面面积,OK,就是此曲线面积了~还有一个经典的随机算法:拉斯维加斯算法,翻译一下,就是赌狗算法我随机产生输入,然后看看这个输入对不对,是不是全局最优,如果不是我就继续随机产生,知道求到全局最优为止算法才会停止,即赌博赌到死,真正的赌狗!我个人最爱的随机算法还是SA和遗传算法,好用点。
      • 接下来就是课程中讲解的几个算法例子,其引入随机性来进行改进了。一个是**”最大割“问题,可以用蒙特卡洛来进行求解**:我每次把点随机分成左边一堆,右边一堆,求一下当前的cut;然后重新把点随机分成左边一堆,右边一堆,再求一下当前的cut;重复此过程。根据期望公式,我们可以得到期望值为 e / 2 e/2 e/2的cut大小(这里 e e e是边的数目,所以应该假设的是边权为1);另一个是快排,众所周知快排不稳定,如果输入序列是有序的(递增或递减),那么复杂度就变成 O ( n 2 ) O(n^2) O(n2)了,究其原因是每次快排的时候的主元(pivot)都是选的第一个所以我们引入随机性——随机选pivot,那么随机快排Random QuickSort就会复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)
      • 接下来是hash。众所周知,hash的查找和插入理论上是 O ( 1 ) O(1) O(1),但是如果有很多冲突那直接完犊子,就会变慢很多,性能变差。究其原因是hash的函数 h ( x ) h(x) h(x)不够均匀(universal),甚至即使均匀也会有一系列的输入序列使得它能够的hash冲突数贼多。所以我们引入随机性,随机选hash函数。这里涉及到的一个知识点就是,当我们选取哈希函数是 h ( x ) = ( ( a x + b ) % p ) % m h(x)=((ax+b)\% p)\% m h(x)=((ax+b)%p)%m,(其中 x x x是输入关键值, a a a b b b是常数, m m m是hash表的长度, p p p是大于 m m m的一个质数),这个hash函数肯定是均匀的,如果我们随机取 a a a b b b,那么就能实现更少的冲突期望
      • 后面还讲了完美hash,完美hash就是没有冲突的hash,实现方式就是使用”二级均匀哈希“实现~

2 计算机体系结构Ⅲ之HPC

​ 这两周的授课进度加快了,分别介绍了HPC系统的Performance Monitoring工具,例如 g p e r f gperf gperf,可以产生系统性能运行的统计,又比如性能分析API之PAPI,TAU,VampirTrace,并展示了一些简单的case。

​ 第二,讲解了一些debug软件,首当其冲的就是GDB,列举了一些典型常用操作与例子。

​ 第三部分主题是accelerator architecture,介绍了一些经典的协处理器,例如Intel 8087等,再过渡到GPU的属性与特征,介绍了一些基于GPU编程的CUDA、OpenCL、OpenACC等概念。

​ 感受的话,个人觉得还是得回归textbook,不然听slide上的概念并快速蜻蜓点水,可能收获非常微薄。之后还得刷完整个textbook再写一遍HPC的个人感受。

3 数字VLSI设计课程设计

​ 近两节VLSI课一来是为课程实验做了一些介绍与布置,二来是讲解了一节数值系统的课程(CS的计算机数值存储方式的内容):

  • 介绍一些通用处理器、DSP、FPGA、ASIC的关系,从左到右越来越专业、高效、但复杂(要定制化)。
  • 介绍整数的原码、反码、补码关系。
  • 介绍了二位补码的特点,以及符号位拓展。
  • 讲解了一些符号数值表达的东西,如最小数值表示方式、Canonic数值表示方式等;
  • 介绍浮点的表示方式,以及经典的IEEE754标准。

4 研究生论文写作

​ 近两周写作课开始讲一些稍微细节一些的内容:如何撰写research article的各个内容部分,它们要写哪些东西(和review paper的写法是不一样的)。之前院长来做过讲座讲过,现在是授课老师从其角度分享经验,毕竟写作风格因人而异,有些观点是各有千秋的,简单的一些mark如下:

  1. 文体结构都是IMRAD (Introduction, methods, results, and discussion).
  2. 文章的目的是为了分享与沟通,不是为了炫技,所以写论文的核心是clarity. 那么叙述逻辑,当然非常重要。
  3. 强调了审稿人的“小同行”与“大同行”的区别,以及其对应的审稿特点。
  4. 文章的长短是撰稿人功力的部分体现。
  5. Title的一些注意事项、重点与禁忌(例如千万不能是assertion)。
  6. 作者署名的顺序、其意义、以及老师个人的观点等等。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值