渐构学习的理论如何应用在编程类知识上?

关于渐构学习的理论,如何应用在编程类知识上?


我在看过渐构课程后了解到真正的学习就是归纳总结经验,构建判别模型,用通过模型去预测未见的情况。

明确输入是其中很重要的一环。可是在编程知识上我有点不知如何下手。

编程知识多是符号和概念,就类似英文单词,多个符号拼在一起才能构成有有意义的句子。

但是跟单纯的记单词似乎又不太一样,编程更注重结构。

记单词可以说是,符号与概念的映射,输入是符号,输出是概念。

但是编程似乎就是符号与结构的映射。


从需求上讲,我是希望能够快速掌握某个工具的使用,比如学会使用python。

我看过很多视频,但总是会被讲述的原理绕晕,因为计算原理、算法本身就很抽象(算法好像也没办法去渐构判别模型吧,只能记,不是很明白)。

而且教学基本都是介绍语法规则和API。

实际上在跟完教学后,我是能记住大概的写法。但是却依旧是会出现无从下手的情况。我想这是经验预测导致的。没有建构出模型。

问题似乎是出在输入输出上,输入是符号,输出是结构。


所以我想知道关于编程这类知识是如何应用渐构来学习的

2 个赞

编程是语言类知识,语言是用来描述现象的。大方向来说,其输入是【任意现象】,输出是【描述该现象的编程语言】。小方向来说,你还是在学习判别模型和联结模型。判别模型是学会判别一个个编程的概念。如字典、列表等。

2 个赞

感谢回复。

目前了解渐构后,对小方向输入输出的概念学习确实有所帮助。但对大方向输入输出的概念却依旧不得要领。


比方说,我要实现求数据的平均值。

我先用内隐模型(是不是的概念)拆解这句话:数据、平均值、求、求平均值

再用外显模型判别进行判别:

  • 数据:是否属于编程中的列表的概念 → 是
  • 平均值:是否属于编程中浮点数的概念 → 是
  • 求:是否属于编程中运算的概念 → 是

再通过数学概念求平均值使用联结模型推测出编程符号avg()

最后套用编程语法的结果就是

value = avg([1,2,3,4,5])

这里有几个问题就是

  • 在编程领域中联结模型是一种经验预测吗?换句话说求平均值avg()的映射是否只能记忆?这样的话,我在学习编程的过程中,是不是应该不断的记忆各种API符号?
  • 在套用语法过程,语法似乎也是经验预测,也就是人类的语言符合编程的语言结构时可以套用,或者说人类语言刚好在描述编程语法本身,但是只要人类结构稍有不同,就没办法通过经验预测。比如,实现计算器功能。就不能用上面例子的办法来推测了。现在的问题就变成如何拆解这句话,让它变成可以套用上面的结构。所以我想知道这个拆解是在学习什么,并如何去学习?

我给你举一个关于大方向的例子吧。
例如,眼前有一个「现实问题」——你打算买金戒指,你不在意服务和品牌,仅想知道哪个店更便宜。但这毕竟是一个「现实问题」,不是「编程问题」,而编程的大方向或者说编程思维,就是要把这个「现实问题」先转换成「编程问题」,再利用编程语言中的语法,写出代码,运行出结果。对于这个例子而言,你就需要去提取「变量」「常量」(编程语言中也有此概念)。比方说,A店的店员告诉你,854元一克,而B店的店员告诉你,960元一克。并没有告诉你要把什么视为变量,而你选择将「克」视为了变量。亦或者,你觉得自己会逛很多金店,你又把「金价」定为了变量。
所以在大方向上,高阶知识层面上,编程属于将「现实问题」转换成「编程问题」的一门知识,数学语言、自然语言也都是这种知识。他们都叫语言类知识

2 个赞

你追加的问题很明显是没有引入「抽象层级」和「对象层」,导致你把「模型推测」和「经验推测」全搞混了。联结模型既然被称为模型,怎么可能会是经验推测呢。同时你对「概念」和「符号」的理解也不到位,建议再看看「语言世界」的部分的内容,比如30 背单词拆解:大脑究竟在完成什么任务 - 渐构·世界模型 - 渐构 Modevol

「求平均值」到“avg()”并不是一个联结模型,而是「符号」和「含义」之间的指代,你是用“avg()”去指代「求平均值」,但它本身是一个概念。你需要建构关于「求平均值」的判别模型,去判别「任意现象」是不是「求平均值」,两个人分4个苹果是吗?如果你没建构起概念的判别模型,光知道如何指代,没有用,因为你无法从「现实问题」转换到「求平均值」这个概念下。

3 个赞

学习编程这个问题上,是挺复杂的。只能根据自己先有的编程水平,做分析。
我没办法了解您现有的水平,但是根据我自己的编程学习的实际经验,先不要贪多,因为包括了数据结构、逻辑判断、操作系统、计算机网络等等方面,很容易造成混。可以先从最基础、但是也是最重要的概念入手,如:“变量”、“函数”、“面向对象”等,慢慢的构建「判联分析」,先从自己需要处理的编程的DEMO开始,逐步的构建吧。

1 个赞

看懂了 :star_struck: 我之前的思路被限制在「材料」处理上了,还是没跳出来,单独增加这个概念的「判别」的练习

我好像知道为什么学习完编程教程,但还是不会用的原因了,主要是以下几点

  • 首先市面上的编程教程几乎都是在描述语法、介绍常见用法、展示场景单一的案例,所以我渐构的「编程模型」更像是套语法结构,以及固定案例的经验预测。
  • 其次是「编程模型」的输入弄错了。我一直认为编程是「自然语言」转换成「编程语言」的过程,是一种翻译。但现实中「自然语言」包含很多抽象层级很高的概念,遮蔽了很多的细节。虽然「编程语言」中也可以用「类」来映射「自然语言」中概念,但很显然我还是不知道「类」里面应该有什么。所以「编程模型」输入就不应该是「自然语言」,而是「自然语言描述的编程语言」
  • 再来就是学习材料的缺失。就如于老师所说的,我需要学会「现实问题」转换成「编程问题」的知识,然后再学会「编程问题」转换成「自然语言描述的编程语言」的知识。然而在我的学习材料里面并没有这些学习材料,或者说很少。

就好比,我学会了用锯子、锤子,现在有钉子和木板,学习材料的案例告诉了我怎么把木板锯成小片以及怎么把木板钉在一起。

我以为我学会了做木工。但真要我做一把椅子出来,却是没办法。

也就是说我会使用工具但我缺少解决问题的方案。


顺便尝试理解一下于老师所说的「编程问题」,比如说一个现实问题

我要实现一个计算器程序

那么转换成编程问题就是

我需要计算器程序,功能如下
1. 实现两数相和的功能
2. 实现两数相减的功能
3. 实现两数相乘的功能
4. 实现两数相除的功能

总而言之,我的理解是把「现实问题」拆解成尽可能小的问题,直到这些问题的可以被学习材料中案例通过经验推测出来,最后的问题集合就是「编程问题」

确实,我有很多渐构的概念运用的不是很熟练,得回去再多学几遍了 :joy:

现在应该应该是处于瓶颈期,属于是了解了说明书,但不知道怎么解决问题。

也不太清楚怎么应用渐构理论到这种类型的学习上来。

毕竟网络上编程语言很多,工具包也很多,相关的教程更是数不胜数。

希望能高效学习。

1 个赞

渐构这套理论只是一种泛化能力强的学习框架。泛化越强越没法解决具体问题,细节都抽象掉了呀,你遇到的具体问题中的主要矛盾也因为没有细节而无法仅用这个理论去分析和处理(至少要补充足够的细节)。
编程在具体运用时就是用已有的一些积木搭建出你想要的“输入->输出”映射关系的一个能动的过程。从这个意义上,scratch非常适合进行编程入门学习,因为scratch抽象掉了编程语言的各种语法,只保留了最核心的程序执行概念,并以图形化的符号进行表达和编辑。用scratch建构指令式编程的概念模型要比用文本代码(C、java、python等)要少一次语义的转换,心智负担要低一些。错误的组合用法图形界面直接就给你否掉了,而不是到编译执行时才给你报出一堆错误。
当你对程序的基本执行过程有了认知之后,再去攻关语法(这就是经验预测的一一对应而已)会更有目的一些。这一步可以结合着编写一些小功能来一起完成,编译器和程序的执行结果就是最好的语法和语义检验手段。
有了这两个基础,就可以向外扩展。比如有图形界面的程序如何实现、需要在后台执行的如何实现、需要一段时间后执行的如何处理、数据如何存储和读取、与其他程序通信该如何处理等等。每次在已掌握的模型基础上前进一点点,降低心智负担。
这些都实操一遍并弄懂之后,大概就入门了。可以开始尝试用程序解决实际问题。这个时候模型依然重要,要有三层建模过程:概念模型、数学逻辑模型、程序模型,最后才是运用之前的基础编码实现。概念模型是要以问题为导向对现实世界建模,选择恰当的颗粒度来表达对象之间的关系。然后根据概念模型将问题转换为数学或逻辑的计算问题,最后通过合适的编程技术组合设计程序模型,拆解出各类型和算法函数,实现相关的计算。

渐构这套理论只是一种泛化能力强的学习框架。泛化越强越没法解决具体问题,细节都抽象掉了呀,你遇到的具体问题中的主要矛盾也因为没有细节而无法用这个理论去分析和处理。

你咋学的课程啊,泛化能力强就是能解决的情况多,怎么会用到这里。细节抽象掉了是说的概念遮蔽,跟你说的这些又有啥关系,里外里我看你对我们这个课有点意见?

贬低我们的课程不能够抬高自己,你用课里的名词却不知道名称的意思,攻击稻草人没意思,不妨展开说说?

2 个赞

我对课程里的很多观点是有不同理解的,但并不影响关于这个问题的讨论。注:原答案里的一部分措辞我已经调整了,为了避免引起歧义。
我说“泛化能力带来的细节丢失”本身就是课程里的观点。细节丢失导致只能在这个概念所涉及的属性范围内进行讨论和应对,但很多具体问题是子概念本身区别于母概念的特性引起的,这种情况下当然不能用过分简化的母概念的相关模型进行处理。我在下面的论述中表达了编程这种具体学习需求的特点,并给出我自己的理解下的学习难点和流程思路,这些流程都是渐构之外的部分,属于从编程所用知识体系的复杂性中进行由易到难认知过程的一套方法,符合“心智负荷”理论。其实这套过程也符合渐构思想,只不过不是端到端的不同精细程度的渐构,而是分层逐步加码的渐构。
你动不动就把问题的异见讨论上升到人身攻击上,实在是有些二极管了,于博发视频批判过这种思维,也给出了解决方法,建议好好学学。

这块确实是你理解错了课程。

先说结论:课程里的说法是:

  1. 「概念编码」会剔除细节。这是一个中立现象。
  2. 因为「剔除细节」并不就是坏事,有时候还是好事,只有选用了「不当的概念」去编码时,才会产生坏事,因为剔除掉了与「当前问题」相关的属性。叫做「概念的遮蔽」。
  3. 所以,坏事不是「泛化」导致的,是「不当的概念编码」导致的。

举个例子:假如这个图片是原始的「对象」。

  1. 如果我用「拳击比赛」这个概念,来编码这个「对象」,那么「有多少个观众」「比赛双方的个人长相」等图中显示出来的信息,都会被这个「编码行为」给剔除掉。

  2. 编码的过程其实是将「对象层」从「图像」上移到了「高层概念」这个层面上。但是,「概念编码」并不一定就是坏事。假如我的「目的」是推测「这场的售票是多少钱」,那么我只需要编码「观众数量」即可,其它属性都可以剔除掉了。可如果在这个「目的」下,用「拳击比赛的举办时间」去编码,关键属性就被剔除掉了。

  3. 「泛化」跟「概念遮蔽」是没有关系的。

「泛化」指的是「模型推测未见对象」的能力,本身就是在解决具体问题的,是一个由理论向下应用的过程,不是单方面搞概括。
例如,牛顿第二定律。

  1. 要运用这个定律,我们就需要把「现象」的编码成「加速度」「质量」「合外力」,这会剔除掉物体颜色、材质纹理、空气湍流等无数细节。但这并不一定是坏事。
  2. 如果我们要计算炮弹轨迹时,只需关注质量、加速度、受力这些核心参数,其他细节的剔除反而让物理建模成为可能。
  3. 但若在「设计降落伞」的场景中就会发生「概念遮蔽」——因为此时空气阻力特性这个关键属性被错误剔除,导致模型失效
  4. 所以,坏事不是「泛化」导致的,是「不当的概念编码」导致的。

再拿牛顿的万有引力定律来说,其泛化能力极其凶残,若按你的说法,岂不成了:因为万有引力定律的泛化能力强,所以缺失细节? 很显然不合理啊。

2 个赞

关于楼主的编程问题。

  1. 渐构的理论是可以聚焦于非常具体的学习问题的,楼主如果当时聚焦于一个具体编程知识的学习,我就会给他举出如何应用渐构理论的具体案例。只是楼主问的是一个宏观问题,那么我的回答就需要配合他一起变得宏观。
  2. 其次,很多人其实在面对「高阶知识」时,都会发懵,从你的回答中也看到了是发懵了。
  3. 啥叫高阶知识?渐构运用数学语言中的「映射」来表示知识,那如果所学习的知识本身就是「映射」时,会怎么样?这就会变成用「映射」来表示「映射」知识,一个「二阶知识」,此时大家就不会用了。此处形成了一个嵌套,就跟二阶导数一样。对于编程知识,其实经常就会出现这种「二阶知识」,所以我才又在“大方向上”提了一嘴,这种二阶知识如何表达
1 个赞

其实你回答就回答你自己的理解就好了。暂时别加上「渐构是如何的」。
我看了你那么多的回答,凡是加上「渐构是如何的」基本都讲错了,渐构的课程里本来没你理解的那种意思,结果你一编码,就形成概念的遮蔽了,大家以为这就是渐构所讲的,就不会看原课程了,我就得去澄清。
同时,令人费解的是,你的回答中,有些地方表述是很好的,有哲学方面的功底,可不知道怎么就得出了个渐构没有的结论,甚至让人觉得你小子是故意找茬的

2 个赞

我说的渐构分析法过于泛化,是其聚合了各种各样的学习类型,导致一些学习类型的细节缺失,而这些缺失的细节本身会影响学习这种类型学习方法的设计。尽管渐构分析法的第四第五条提到了要分析最适学习材料,和最适学习方法。但在这个材料和方法适合个体之前,它首先要找到适合这种知识和一定水平的人类群体的通用的材料和方法,再结合个人的特点进行微调。
广义上讲,学编程是一种语言学习,但显然这种学习和自然语言(英语、日语)的学习不一样,不能拿课程里将的学识音、学识义来对应。因为编程对应的意义世界的原型不来自于自然界,而是完全由人造的存储器、计算器、传输等组成的复杂系统,学编程之前要先学习这些人造物的概念和能力,才能当成一般的语言来进行学习。
并且,使用编程语言的过程也与自然语言不同。首先这种语言要确保编译器(解释器)能正确理解,而不是另一个智能主体。这意味着符号的解码没有纠错功能,程序符号不能有任何二义性。这种要求语法符号必须集中攻关,而不能像自然语言那样先用着看,错了再慢慢调整,编程语言出错就进行不下去。其次,编程语言是对既有功能的组合运用,语句只是对这些运用的等效转义。这种组合运用要用到设计思维,如果设计出错了,语句翻译得再好结果也是错的。所以程序必须涉及场景分析建模、数学逻辑表达、程序结构设计等过程,而这些与一般意义上的编程关系不大,属于编程之前的步骤。跳过这些步骤直接编码,对于复杂一些的软会导致件思维能力不足而无法完成,或者一堆bug。
编程学习中的这些关系必须被澄清,不能拿着泛化能力超强的但具体细节缺失的渐构分析法直接运用到编程学习的过程中。否则就像拿着国务院的一号红头文件来直接指导村里养猪一样,缺少现实意义。我记得课程里也有关于领导讲话听上去像废话的例子,跟这个是一个道理。

我也不跟你抽象地讨论了。你随便列举一个具体的编程知识,我详细给你列出来该怎么运用渐构理论来学习它,列举出事实说话,别停留在抽象层面上去评判了。

我给你列举一个具体的编程知识好了。对于「python的字典」这个知识:

  1. 你自己认为该怎么学习?
  2. 你以为的渐构理论又是怎么学的?

您说的教程和资料很多的情况,就像于博之前在直播课里说过的,先判别什么是“差材料”?比如,代码功能写的太长、架构逻辑混乱等等,然后再看一些优秀开源项目的代码,站在巨人的肩膀上成长会更快。
“高效”这个话题,因人而异吧。哎。。对于我自己的情况来说,编程实践只要不走弯路就是高效了。。。接触【世界模型】这本课这段时间,简直比我几年的效果都要好,因为我之前就是完全分不清记忆和学习的区别,课程里面所有的误区,我都踩了一遍。。。所以,对于我来说,避坑就是【高效】吧。因为每一次从坑里爬出来的心理负担和代价都太大了,我之前因为严重怀疑自己都不适合学习编程的、压根没这个天赋,就靠死记硬背,真的十分痛苦,哎。。。事倍功半啊