一时兴起的听写, 不保证对. 听了个开头 (然后看完了), Sam 的台词最容易听.
正则灾难性回溯与防御方法
灾难性回溯
考虑用正则表达式 (x+x+)+y
匹配字符串 xxxxxxxxxxy (10 个 x). 显然正则可以改写为 xx+y
或者 x{2,}y
, 但先不管这点, 该例旨在展示匹配机制.
- 第一个
x+
匹配 10 个 x, 第二个x+
没匹配上; 于是第一个x+
回溯 到匹配 9 个 x, 第二个x+
匹配一个 x. 至此 group 1x+x+
完成了一次匹配. - Group 1 尝试重复, 但失败了, 于是
(x+x+)+
完成了一次匹配. 接下来匹配 y, 完成匹配.
删除字符串结尾的 y 使得正则匹配失败会导致 灾难性回溯 (catastrophic backtracking).
RabbitMQ 消息确认机制
生产者先把消息发到 exchange (很多个), exchange 决定把消息分发到哪些 queue (很多个), 再从 queue 发到消费者.
确认机制分为两部分, exchange 确认收到 publisher 的消息, consumer 确认收到 queue 的消息. 来自官方文档 Consumer Acknowledgements and Publisher Confirms — RabbitMQ
《看不见的女性》笔记
- 卡罗琳·克里亚多·佩雷斯. (2022, Aug). 看不见的女性. 新星出版社.
原书还有副标题, Invisible Women: Data Bias in a World Designed for Men. 书中陈列了大量数据和例子展示这一点.
论及性别数据缺口, 最重要的观点之一是它通常不带恶意, 甚至并非有意. 事实恰恰相反: 性别数据缺口完全是一种存在了数千年的思考方式的产物, 因此也可说源于不思考. 双重的不思考: 男人不言而喻, 女人不被提及. 因为当我们说到人类, 总的来说, 我们指的是男人.
三个主题: 女性的身体, 女性无偿看护的负担, 和男性对女性的暴力.
将人类 (human) 默认为男性, “不加说明就是男性”. 比如众所周知, 很多职业需要在前面额外加个 “女” 以示区分, 以及很多语言单词里也有默认性别. 有趣的是, Unicode 将 “跑步者” emoji 加入编码后, 大多数平台使用的图标是男性跑步者, 直到 2016 年 Unicode 区分了两性跑步者. 虽然这些平台想设计出 “中性” 的跑者形象, 但多数人还是会把它看作男性. (国足指男国家队.)
影视作品中女性出现比例也显著小于男性: 儿童电视角色中女性非人类角色, 电影主演, 出场时间 (只有当主角是女性时, 两性出场频率才大体一样, 而不是女性更多) 等. 不平衡还表现在雕像, 钞票, 新闻媒体报道上等.
这种完全由男性主导的文化带来的后果是, 男性的经验和视角被视为普遍, 而女性的被视为小众.
轻量级篇章事件抽取: PTPCG
起点是 ChFinAnn 数据集, 和它的 SOTA 榜单. 其中
- Zhu, T., Qu, X., Chen, W., Wang, Z., Huai, B., Yuan, N. J., & Zhang, M. (2021). Efficient Document-level Event Extraction via Pseudo-Trigger-aware Pruned Complete Graph. arXiv preprint arXiv:2112.06013. [Code]
看起来很不错, 模型比其他人轻量很多, 训练资源要求少 (对比 Doc2EDAG 等涉及到动态建立图神经网络的巨大计算资源需求), 推理速度也快, 效果和其他人相当.
SQLAlchemy 简要
import urllib.parse
import sqlalchemy
password = ...
# escaping special characters such as @ signs
password = urllib.parse.quote_plus(password)
url = f'dialect+driver://username:{password}@host:port/database'
engine = sqlalchemy.create_engine(url) # Engine object
with engine.connect() as conn:
results = conn.execute('SELECT * FROM students')
for row in results:
print(row)
Python 并发简要
并发 (concurrency) 和并行 (parallelism) 是两个概念. 这两个术语的使用还有争议, 下面依照书上 (Fluent Python, 2nd Edition) 的说法, 并行是并发的子集.
A modern laptop with 4 CPU cores is routinely running more than 200 processes at any given time under normal, casual use. To execute 200 tasks in parallel, you’d need 200 cores. So, in practice, most computing is concurrent and not parallel.
深度学习性能瓶颈往往是内存带宽
首先是这篇文章
- Horace He. (2022). Making Deep Learning Go Brrrr From First Principles
内容不再赘述, 下面是纲要和一些对原文的注解. 虽然文章用 Torch 和 GPU 举例, 但基本原理依然普适.
注 (Show more »)
机器之心 编译 过这篇文章, 但有些错误. 比如只看第一段, 前几句话还行, 但光最后一句就有两个技术错误: (1) 把 in-place 说成内置; (2) 梯度设置为 None 说成 0. 关于第 2 点可以参考 torch 文档 Use parameter.grad = None instead of model.zero_grad() or optimizer.zero_grad().
简单介绍了模型耗时可以分为三部分
- Compute: Time spent on your GPU computing actual floating point operations (FLOPS)
- Bandwith: Time spent on moving the data from CPU to GPU, from one node to another, or even from CUDA global memory to CUDA shared memory
- Overhead: Everything else
Python 自动化杂录: Makefile 等
Makefile
直接看原文
- Aniket Bhattacharyea. (2021). Makefile Tutorials and Examples to Build From
- Aniket Bhattacharyea. (2021). Creating a Python Makefile