这里我分享一下ICS大三的学习经验,希望能给学弟学妹一些帮助。

关于自学

对CS学生来说,自学是非常重要的,毕竟学校没办法把所有东西都讲给你,每个人想学的也各有不同。再者,我们学校CS教学深度越来越浅,比如到大三了还没有一门课教过Git、Markdown还有Vim等基本的工具,不额外自学恐怕未来很难能胜任比较好的职位。

所以我想给学弟学妹们推荐几个基本的自学资源:

  1. CS自学指南:堪称CS自学资源大全,有各类CS课程的资源和经验分享,可以找自己感兴趣的学。
  2. MIT Missing Semester 2020:CS入门课,会教很多重要的基本工具,如Git、Vim等,以后会经常用到。这门课也有中文网站,可以自己找找。
  3. UC Berkeley CS61b:伯克利的经典数据结构课程,基于Java讲解数据结构,同时也会教完成作业需要的Git等工具的使用。一门课顶我们四门课的量,质量没啥可说的,就是学起来要花不少时间。

关于大作业

大三的课程可能会涉及到不少团队合作的大作业,就我们而言有小组大作业的有CAN201、CPT202、CPT208和CPT204,需要大家提前组队。其中有Report的有CAN201、CPT202以及CPT208,而CPT204的为视频Pre。有Report的三个大作业的Report评分占比基本上都超过50%。所以我个人认为Report往往比Coding更加重要,这可能是大家会忽略的地方。而Report会经常用到大一大二EAP所学的知识,当然也要根据要求变化,但学术写作的写作技巧基本上都是一致的,无非就是内容更偏向技术方面。学弟学妹们可以参考具体课程要求来看。

关于具体课程

我主要分享三门我分数比较高的课的经验,其他课程我都七十多分左右就不再具体讲了:

  1. CAN201 (Introduction to Networking): 88%
  2. INT201(Decision Computation and Language): 82%
  3. CPT204 (Advanced OO Programming): 100 %

1. CAN201 (Introduction to Networking)

1.1 参考资料&考试准备

资料:如果大家跟我一样听学校的课比较懵,可以参考中科大郑铨老师的计算机网络课,b站就能看:中科大郑铨-计算机网络。要注意的是,中科大的课在有些地方会将得更详细一点,可以对照学校课件来看,不过基本上都能对应得比较好。

考试:这门课期末考试难度不大,题型比较固定。建议把前两年的题都做会订正好,这样考八十多分还是比较容易的。

1.2 大作业

这门课的大作业似乎每年都不太一样,但基本上就是对网络协议和路由交换等内容的实操,代码部分可能需要一定编程理解能力。可能会给你一堆很长的代码,要你Debug并且完成空着的部分,一上来分析起长代码来可能很头疼,但是按照函数执行顺序一条条理顺下来之后其实就很简单了。不过这个作业大头其实在Report上,要写很多字,还要作图、写伪代码、实验分析什么的,还是挺花时间的,所以最好别拖太晚。

2. INT201 (Decision Computation and Language)

这门课教的内容基本上都比较简单,建议可以课前自己先学一遍,课上老师会一步步写过程,跟起来会容易很多。

前面部分内容可以参考哈工大的:形式语言与自动机理论,但是后面可能就不太一致了。

和计算机网络一样,这门课考试形式我记得也比较固定,平常的练习题都做好,往年试题也做一下的话拿比较好的分数问题不大。

3. CPT204 (Advanced OO Programming)

这门课我拿了满分,简单来讲就是Java的进阶课程,用Java语言讲面对对象编程的各种概念。课程难度比较小,历年均分都很高,但也是很实用的一门课,无论是工程实践还是参加算法竞赛,都能给你很大帮助。我是上完课几乎裸考的蓝桥杯B组国三,如果你想参加蓝桥杯Java组,那推荐你可以先学下面的6.031同时刷Leetcode来准备基础知识。

这门课我完全自己看课件和下面的资料上的,结合这两个学基本上不会遗漏任何知识点了,所以我也就没去上过课。

3.1参考资料

这门课知识内容基本上就是 MIT 6.031: Software Construction 的简化版,并且MIT网站上有很详细的文字版和例题,所以可以很大程度上作为知识参考

我是看的20秋的:6.031: Software Construction, Fall 2020

3.2 大作业

我们去年的大作业就是实现一个游戏的AI玩家和GUI,还有视频的Pre展示。这个基本上就是UC Berkeley CS61b的某个大作业的修改版,框架源码基本上没改,所以网络上有很多可以参考的资料。不过具体的算法实现需要查文献资料,但不需要你卷算法部分,评分更在于结合文献讲清楚使用算法的原因,以及其他课上内容的实践。此外还有一个额外加分的GUI,不过加得不多做起来也挺废时间的,看个人取舍吧。

此外,课程还包含比较多的代码实践,基本上更在于对实现的数据结构的理解,基本不太涉及复杂的算法,难度都比较低。如果觉得比较困难可能平时就需要多刷刷题,看看是Java语言不会用还是数据结构没理解,尽量自己做别跟别人要答案,因为考试还有限时写代码的部分。

未来有时间可能会总结一下在西浦的整段学习经历,然后会根据那些重新写一遍这篇文章。

更新内容

  1. 添加评论系统(Gitalk)
  2. 配置图床(Github + PicGo + CDNJS)
  3. 添加留言区,设置页面评论功能
  4. 添加了图片缩放等功能
  5. 添加了图片懒加载功能
  6. 设置书签为手动模式
  7. 移除菜单中分类和标签,将其放在侧边栏下方
  8. 添加 CNAME 文件,解决部署后自定义域名失效问题 [1] (2023.11.17)

参考

[1] CSDN 文章:解决 Hexo 部署 Github Pages 自定义域名失效的问题(即使已添加 CNAME)

1. Introduction to ANN

1.1 Relationship between the key concepts

我们知道ANN是人工智能领域的一环,但是它具体在这个领域有什么样的作用呢?要回答这个问题,我们就需要搞清楚人工智能方面几个概念之间的关系,即包括:

  • Artificial Intelligence (AI)
  • Machine Learning (ML)
  • Neuron Network (NN)
  • Deep Learning (DL)
relationship demonstration

首先,AI(人工智能)是一个很大很笼统的概念,我们可以将很多事情称为人工智能,比如说让机器进行1+1的算数运算,虽然这是一种程度很低的人工智能,但它确实也能够模拟人类的一部分能力。

其次,ML(机器学习)是人工智能的一个子领域,其指的是,通过统计学方法或是数学模式,使得计算机能够从数据中进行学习改进,从而达到某种模拟人类的能力。

而,NN(神经网络)则是一类机器学习算法模型,其结构设计由早期的神经学家在解剖和生理学的的研究成果启发而来,其一开始的目的在于模拟大脑的神经结构。但是随着发展,神经网络的结构和真正的神经元除了名字,差别已经非常大了,而演化来的神经网络则被广泛应用到了机器学习中。

最后,DL(深度学习)是一类多层(Multi-Layer)的神经网络,与神经网络一样,是机器学习的一个子领域。

1.2 Abstract neuron (from Biology to Computer Sicence)

我们在高中都学过神经元的基本结构和功能,这里我们基于神经元的结构和功能,尝试通过构建一个抽象神经元来模拟真实的神经元。

abstract neuron

如上图所示,我们构建一个抽象神经元\(j\)

  1. 输入(Inputs):神经元能够彼此接受信息,抽象神经元\(j\)中有\(n\)个输入\(x_1,...,x_n\)还有输出\(o_j\)
  2. 权重(Weights):此外,神经元不同路径的输入的重要性可能不同,对应\(n\)条不同路径的不同权重\(w_{j1},w_{j2},...,w_{jn}\)
  3. 偏差(Bias):通常神经网络模型还会有偏差(即bias,对应\(x_0,w_{0j}\),其中\(x_1\)总为\(+1\),而\(w_{0j}\)可在学习中改变)。
  4. 再者,神经元会处理接受的信息,并判断如何做出反应。这对应的是:
    1. 处理输入信息:通过转化函数(transfer function),将零散的输入数值转化成一个值,以进行下一步处理。这个转换函数接受加权后的输入,输出转化后的网络输入值(net input)\(net_j\)。 比如,一个简单的转化函数可以是求和函数\(\sum\),将加权输入值求和传递到下一步。
    2. 决定输出:使用一个激活函数(activation function)根据处理过的信息决定神经元的输出。一个简单的激活函数可以包括一个阈值(threshold)\(\theta_j\),函数简单得将输入的\(net_j\)和阈值\(\theta_j\)进行比较,如果输入能够超过阈值,那么神经元被激活(activated),向下一个神经元传递信息;否则不做出行动。

2. Constructing ANN from the Beginning

基于前面的理解,我们开始从头构建神经网络的概念。首先我们从最简单的模型开始学起。需要注意的是,虽然下面的不同模型直接有时间上的递进和概念上相对的继承关系,但实际上他们的概念互不隶属,注意区分理解。

2.1 The McCulloch-Pitts Neuron (1943)

为了方便讨论,这里只讨论仅存在唯一神经元的情况,故不对属性作神经元标记

2.1.1 Basic definition

这种神经元模型的神经元有下面几个特点或属性:

  1. 离散时间(Discrete-time):神经元的输入输出等值具有离散的时间属性
  2. 二元(Binary):输入\(a^t_i\)输出\(x^t\)是二元的,即只有1和0两种情况。
  3. 有激活和抑制权重(Excitatory and Inhibitory Weights):权重有激活(excitatory, +1)和抑制(inhibitory, -1)两种情况。
  4. 有激活阈值(Excitation Threshold):每个神经元都有一个激活阈值\(\theta\)
mp_neuron demo
2.1.2 Calculating the output

对一个MP神经元,其\(t\)时刻的输入所对应的输出为\(x^{t+1}\),当且仅当其状态达到阈值时输出为1,即 \[ x^{t+1}= \begin{cases} 1\text{, iff }S^t=\sum_{i=1}^n a^t_iw_i\ge\theta\\ 0\text{, otherwise} \end{cases} \] 神经元的状态(State):我们称这里某时刻的加权输入总和(instant total sum)\(S^t=\sum_{i=1}^n a^t_iw_i\),为 Instant State of the Neuron。神经元还有其他状态,如Previous State, etc..

2.1.3 Mathematical Definition

Write state as \(f(t)\): 如前面所示,MP神经元某时刻的状态与其他时刻的值无关,仅与其所属时刻的输入和权重值有关,即\(S^t=\sum_{i=1}^n a^t_iw_i=f(t)\)

Write output as \(g(f(t))\): 神经元输出\(x^{t+1}\)对应\(t\)时刻的函数可以写成:\(x^{t+1}=x(t)=g(S^t)=g(f(t))\)

Heaviside Function: 这里的\(g()\)称作阈值激活函数(threshold activation function),用来判断给定状态是否满足输出条件。

对于MP神经元,\(g()\)实际上是一种 Heaviside (unit step) function,即\(H(S^t-\theta)\) \[ H(x)=\begin{cases}1\text{, }x\ge0;\\0\text{, }x<0.\end{cases} \] unit step function

0%