难从天上来,魔由心中起

西天路上,九九八十一难,唐僧四人遭遇的各种妖魔鬼怪,每个章节结束,都发现不过是天上各路神仙的小号而已。

要解决这个问题似乎也不难,放弃取经,各回各家。不过,回家是不是又树立了一个新的目标,回家路上是不是也会有新的妖怪出现?

似乎,只要心有所念,必定会有配套的烦恼涌现。

ChatGPT

最近迷上了chatGPT,逐渐得出一个结论,你使用chatGPT的效果,其实就是你和这个数字世界的边界,或者你和这个数字世界的熟悉程度。

例如

  • 你只使用自然语言,那么就无法享受用机器语言和gpt聊天的乐趣;
  • 局限在中文世界,chatgpt的输出范围,就要有限很多,而且会不自觉带上简中世界的特色,让你觉得在AI的多重宇宙中,无法自拔;

我越来越相信高斯分布,这个世界虽然很大,钟型曲线包裹下的芸芸众生,差异其实很小。而一旦你发现自己和长尾集合中的某个现象有了交集,一定不要犹豫、不要懒惰,要努力抓着它,这是让你摆脱中轴线的唯一机会。

2019年第一次听JJ介绍大模型的时候,除了惊奇外,没有多少想法,毕竟所需要的储备知识近乎于无,而且没有任何应用场景。虽然随后的几年,自己隐隐约约觉得,AI技术是真正的工具,使用这个工具,我可以更好的认识世界、认识自己,就像小时候利用脚蹼进行自由泳的练习一样。

中间几年无非疫情、各种无关紧要的政府项目,JJ也离职去开创自己的事业,虽然短短1年多,我从他这里没有学习到任何核心技术,但是这种人与人的差距,深深影响了我对高斯分布的看法。

终于,chatGPT来了,我梦寐以求的工具,竟然以这么戏剧化的方式将临身边。

一个例子


语句字符串S,就是一个句子,它的概率分布,可以是每个单词在这句话中出现的概率。

𝑝(𝑆) = 𝑝(𝑤1) 𝑝(𝑤2|𝑤1) 𝑝(𝑤3|𝑤1𝑤2) ··· 𝑝(𝑤1|𝑤1𝑤2 ··· 𝑤n)

公式的第一行,是将句子的概率分解为每个单词的条件概率相乘的形式, 例如,p(w2|w1)表示给定w1出现后,w2出现的概率。按照这样的方式,我们可以得到整个句子的概率分布。

总体来说,这个公式展示了语言模型如何基于先前的单词或文本序列,计算出下一个单词出现的概率,并进而计算整个句子的概率分布。

计算一个字符串中每个单词的出现概率可以通过以下步骤实现:

  1. 将字符串S分割成单词序列w1,w2,w3,…wi。
  2. 统计每个单词wi在字符串S中出现的次数。
  3. 计算每个单词wi在字符串S中出现的概率,即wi出现的次数除以字符串S的总长度。
    例如,对于字符串S=“I love to eat pizza”,我们可以将其分割成单词序列[“I”, “love”, “to”, “eat”, “pizza”]。然后,我们可以统计每个单词在字符串S中出现的次数,如下所示:
  • "I"出现了1次

  • "love"出现了1次

  • "to"出现了1次

  • "eat"出现了1次

  • "pizza"出现了1次
    最后,我们可以计算每个单词在字符串S中出现的概率,如下所示:

  • P(“I”) = 1/5 = 0.2

  • P(“love”) = 1/5 = 0.2

  • P(“to”) = 1/5 = 0.2

  • P(“eat”) = 1/5 = 0.2

  • P(“pizza”) = 1/5 = 0.2
    这个概率分布可以用于各种自然语言处理任务,例如语言模型、机器翻译和文本分类等。

大模型训练时,面对海量数据,没法承担高昂的标注成本,往往会采用自监督学习的方式。

自监督学习是一种无监督学习的方法,它通过利用数据的某些属性来设置伪监督任务来替换标准监督任务,从而使模型能够从大量未标记的数据中进行训练。
自监督学习的目标是学习到数据的有用表示,这些表示可以用于各种任务,例如分类、检测、分割和生成等。
自监督学习的一个例子是对于“损失函数中使用到的监督信息无需人工标注”的训练范式的一种统称,自监督学习可以用在预训练上,也可以用在实际任务本身的训练上,当然目前看来还是用在预训练上的情况显著更多.

基础概念

迁移学习(Transfer Learning)使基础模型成为可能

  • 技术层面上,基础模型通过转移学习(Transfer Learning)(Thrun 1998)和规模(scale)得以实现。迁移学习的思想是将从一项任务中学习到的“知识”(例如,图像中的对象识别)应用于另一项任务(例如,视频中的活动识别)。
  • 在深度学习中,预训练又是迁移学习的主要方法:在替代任务上训练模型(通常只是达到目的的一种手段),然后通过微调来适应感兴趣的下游任务。转移学习(Transfer Learning)使基础模型成为可能。

大规模化(scale)使基础模型更强大,因而GPT模型得以形成

  • 大规模需要三个要素:
    • (i)计算机硬件的改进——例如,GPU吞吐量和内存在过去四年中增加了10倍;
    • (ii)Transformer模型架构的开发( Vaswani et al. 2017 ),该架构利用硬件的并行性来训练比以前更具表现力的模型;
    • 以及(iii)更多训练数据的可用性。
  • 基于Transformer的序列建模方法现在应用于文本、图像、语音、表格数据、蛋白质序列、有机分子和强化学习等,这些例子的逐步形成使得使用一套统一的工具来开发各种模态的基础模型这种理念得以成熟。例如,GPT-3( Brown et al. 2020 )与GPT-2的15亿参数相比, GPT-3具有1750亿个参数,允许上下文学习,在上下文学习中,只需向下游任务提供提示(任务的自然语言描述),语言模型就可以适应下游任务,这是产生的一种新兴属性。

Transformer奠定了生成式AI领域的游戏规则

Transformer摆脱了人工标注数据集的缺陷,模型在质量上更优、 更易于并行化,所需训练时间明显更少,
Transformer通过成功地将其应用于具有大量和有限训练数据的分析,可以很好地推广到其他任务。
  • 2017年,在Ashish Vaswani et.al 的论文《Attention Is All You Need》 中,考虑到主导序列转导模型基于编码器-解码器配置中的复杂递归或卷积 神经网络,性能最好的模型被证明还是通过注意力机制(attention mechanism)连接编码器和解码器,因而《Attention Is All You Need》 中提出了一种新的简单架构——Transformer,它完全基于注意力机制, 完全不用重复和卷积,因而这些模型在质量上更优,同时更易于并行化,并 且需要的训练时间明显更少。
  • Transformer出现以后,迅速取代了RNN系列变种,跻身主流模型架构基 础。(RNN缺陷正在于流水线式的顺序计算)

Transformer模型架构如下图

解决xcode更新画菊花问题

按照xcode后,如果遇到更新,往往会出现各种问题,比如watch模拟器无法安装成功,或者就是更新的最后0.0001%总是完成不了,appstore里菊花转圈不断。

解决方法:

  1. 简单粗暴,删除xcode即可
  2. 去apple developer download下载离线安装版本,安装

我最近不太使用swift开发,所以决定删除xcode,顺便节省磁盘空间。

然而,删除xcode后,更新提示还是依然会出现,采取如下几步顺利接触更新提示。

关闭sip

  1. 重启mac,同时按住cmd+R启动恢复模式
  2. 进入恢复模式,启动terminal
csrutil disable
  1. 重启,进入如下目录,并删除和clt有关的系列文件
22-11-06/Users/xxxxx~%>cd Library/Apple/System/Library/Receipts
22-11-06/Users/XXXXX~%>sudo rm -rf com.apple.pkg.CLTools_*.*
  1. 再次进入恢复模式,启动terminal
  2. 启动sip
csrutil enable

重新定位clt工具

22-11-06/Users/xxxxx~%>sudo xcode-select -switch /
22-11-06/Users/XXXX~%>xcode-select -p
/Library/Developer/CommandLineTools

最后,更新brew

brew update

/etc/zshrc

用最简洁的方式,在prompt里实现git branch的信息

增加parse_git_branch函数

final version

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

PS1="%F{12}%D%d~%#>%f%F{red}\$(parse_git_branch)%f"

ZSH prompt的简单生成器

https://zsh-prompt-generator.site/

ZSH现实git branch的另外一种方法

autoload -Uz vcs_info
precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info )
setopt prompt_subst
#RPROMPT=$vcs_info_msg_0_
PS1="%F{cyan}%D%d~%#>%f"$vcs_info_msg_0_

reference

add git branch name to bash prompt

https://scriptingosx.com/2019/07/moving-to-zsh-06-customizing-the-zsh-prompt/

Git删除文件或目录

我在watchlist上新开了一个分支,然后用这个分支模拟一个小团队内部的工作,这个团队有两个成员iMac和MacPro。

由于在iMac上的目录里包含了虚拟空间env,因此在同步到github上以后,我发现macpro里也多了env这个目录和其下的所有文件。

显而易见,这造成如下问题

  • 在github网站上,增加了没有任何用处的新目录env
  • 同步更新时,也要更新这些与主程序没有关系的虚拟环境的内容,而且这些虚拟环境的内容似乎更新的频率也挺高(我估计是日志什么的)

因此这个问题是必须要要解决的。

修改iMac的gitignore文件

  1. 首先在gitignore里,增加env目录,确保每次git add . 和git push不会更新这个目录的内容。
  2. 然后,删除已经提交到github上的文件。
  3. 把这些改变,同步到macpro这台电脑上

然后删除已经提交到github上的内容

最后,在macpro这台电脑的对应git目录里,执行git pull
下图就是执行git pull后,在本地删除env目录的情况

reference
使用git rm解决不应该提交的内容

强大的brew

brew doctor

当brew update无法使用时,运行brew doctor,一条条去修改就好。

brew config

Homebrew bottles (binary package) depend on Command Line Tools (CLT) for installation. After an upgrade, CLT should be reinstalled yet it does not mean xcode installation. To check if you have CLT installed?

brew config

If you found CLT: N\A. Follow @carlocab's answer. Run: xcode-select --install, ...

brew -v

检查目录

brew update

brew自身的升级

brew upgrade

各种package的升级

无法升级CLT时候

在公司网络,无法下载command line tools,可以直接从apple官网下载
https://developer.apple.com/download/all/

解决fatal: not in a git directory问题

使用如下命令

git config --global --add safe.directory /opt/homebrew/Library/Taps/homebrew/homebrew-services

参考
https://stackoverflow.com/questions/9329243/how-to-install-xcode-command-line-tools

https://github.com/Homebrew/discussions/discussions/2391

https://blog.csdn.net/qq_20349639/article/details/125069418

重启flask-1

间隔2-3个月后,重新开始编程遭遇的最常见问题是,是环境搭建

  • 换一台电脑,操作系统版本、python依赖的环境都不相同,比如我的imac,因为硬件限制,mac版本大概会永远停留在在Monterey;

  • 即使是曾经使用顺畅的老电脑,也许经过重大升级,比如2022年10月中旬刚刚发布的macOS-13.0,或许是公司办公网络进行了限制,没法顺利下载补丁,也会遭遇环境方面的问题。

import_tkinter问题

首先遭遇的是tkinter问题,如下所示

import _tkinter # If this fails your Python may not be configured for Tk

在stackoverflow上搜索,大部分答案给出的都是你没有安装好tkinter这个库,解决的方式也很简单,用brew安装

但是对我而言,问题没有这么简单,因为我执行这个命令后,出现的是新的错误提示

fatal: not in a git directory
Error: Command failed with exit 128: git

参考下面reference里小哥的分析,这是因为homebrew的组件homebrew-core和homebrew-cask没有被识别为Git仓库。

解决办法也很简单,直接按照brew的提示就好,输入

brew -v

按照提示来操作即可,如下图

怎么,还是报错,因为我copy如上命令时,没有发现最后一行其实是没有"/"链接的,因此会出现no such file or directory的提示,只要copy正确的命令即可

下来,就是正常安装

brew install python-tk

这样就完事了吗,当然不行,执行flask run,下面报错没有user这张数据库表,那么显然是数据库的问题了

数据库问题

因为我们使用的是SQLAlchemy的数据库,因此我们需要先建立一个数据库文件。

同时,我们会在目录下发现一个名为data.db的文件,这个文件名称来自app.py中的app.config函数

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + os.path.join(app.root_path, 'data.db') 

reference

Command failed with exit 128:git

重启flask学习

时隔多日,重启flask学习,这次打算严格按照如下技能要求自己

  • 使用git做版本管理
  • 使用venv虚拟环境
  • 使用nano或vi编辑器
  • 使用vscode
  • 坚持每天学习

删除venv环境,因为写错目录名称了

升级pip和pip3

从github上clone仓库

从一个远程仓库解绑,然后重新和另外一个仓库建立绑定关系

分别

折腾了一个月,前天手续终于办完。明天母子两人就要去加拿大,准备早晨6点从家里出发赶往浦东机场。

今天特地请假在家,准备一起整理行李,但是工作上事情不断,一直拖到下午才有点空闲,5点钟我提议和马达一起去遛大汪。过去他肯定是拒绝的,不愿意放下手中的ipad,这次挺意外,非常爽快的答应下来。

我印象有挺长时间,马达和我经常结伴去遛大汪。那时候他大概9岁,10岁,大汪也刚刚被我们营救回家。待他上了初中,我们就很少一起活动了。

小区旁边有条河,走了一圈,我絮絮叨叨,努力想把所有青春期的经验传授给他:不要打架,也不要被欺负,多看书,多问问题,多做题,和同学友好相处,照顾好妈妈,不要挑剔妈妈做的饭不如外婆的好吃,他要么就是点头,要么就说知道了,有时候也会插嘴说,我是星战粉,和同学肯定有的聊,会成为好朋友。

走过了小桥,绕回河边,马达突然对我说,可能很久见不到你了,要不大家抱一抱吧。他比我高近10厘米,因为练习剑道的缘故,肩膀很结实,我抱住他,就像抱着一个陌生人,眼眶突然就发热,赶快和他说,你和大汪也抱一下,趁着他蹲下来去抱大汪,我赶快偷偷的擦眼泪。

待他站起来,我的眼泪也隐藏好了,两人就顺着原路返回,走到小区北门口,我舍不得这么快结束,对他说,你看大汪一点也不累,舌头都没有吐出来,要不我们再走一圈?他点点头,我们就打算从南门绕回小区。

两人开始都有点沉默,然后他就笑嘻嘻的说,给你讲一件很奇怪的事情,你不要觉得无聊。我几乎马上猜到,他要讲的就是两年前学校里非常轰动的手枪+手机事件,大概初二的时候他给我讲过好几次了,我装作头一次听说的样子,让他说。

没想到,这次的版本确实让我大感意外。过去的故事里,马达只是一个隔壁宿舍的旁观者,随着这次更多的细节披露,我才发现,故事原本要精彩许多,包括他打算用剑道对抗手枪的计划,让我开心不已。

是柯尔特,他补充说,小熊同学带的就是柯尔特,加拿大应该也有真枪吧,我说是的,加拿大是有真枪的,等我去了可以一起玩。

旁边一辆改装过的奔驰,轰隆隆的开过,马达非常鄙夷的说,我打算拿到驾照后,开一辆哈雷,那种车把非常靠前的,这种奔驰真是不配这种声音。我说是的,我们还要开飞机,我从小就觉得自己已经学会了开飞机,拉杆前推就是降落,后拉就是升起。我们还可以搞一艘船来开开。

好吧,祝你自由。