升级到 macOS 15 之后,我的 nix 怎么没了?!

咋回事? 昨天我愉快地将 macOS 升级到了 15 版本,结果今天用 hugo 建站时,发现 hugo 不见了?! (base) BdimMacBook-Pro:~ bdim404$ hugo -bash: hugo: command not found 我想,我并没有卸载 hugo 啊。 我的 hugo 是通过 nixpkgs 安装的,于是我检查了一下 nix 是否还在。 (base) BdimMacBook-Pro:~ bdim404$ nix -bash: nix: command not found 天哪, nix 也不见了?! 发生了什么? 我询问了一位朋友,原来每次 macOS 升级时, nix 的 $PATH 都会消失。这个 issue 提到了这一点。 I have done a few days before the upgrade to Catalina 10.15.6… and today I wanted to install something to discover that my nix installation was gone!...

九月 17, 2024 · 1 分钟

如何理解嵌入层

想象你在学校里,班级里有很多学生,每个学生都有自己的名字。老师想根据学生的名字来决定他们做什么工作,但名字本身是无意义的,直接用名字没法帮老师做决定。 于是,老师把每个学生的名字转化成一个编号,比如小明是1号,小红是2号,这些编号就像学生的“标签”,让老师能更好地进行安排。但这个编号也不能直接用,因为它太简单了,不能表达更多的信息。 于是老师给每个学生分配了一些“特征”,比如: 小明(1号):聪明,运动能力好,喜欢数学。 小红(2号):细心,擅长绘画,喜欢语文。 这些“特征”就像嵌入层做的工作。它把原本没有太多意义的“名字”变成了有特定含义的“特征向量”(数值向量),然后老师(神经网络)就可以根据这些特征进行更复杂的决策,比如安排小明去参加数学比赛,安排小红去绘画比赛。 嵌入层的作用: 它把原本像“名字”这种离散的数据,转换成能表达更多特征的数值向量,帮助神经网络更好地理解数据的含义。这种转换让机器能“理解”那些原本无法直接使用的信息(比如文本、类别)。 上面的内容我觉得能够解释得清楚嵌入层大概的原理和作用是什么了。 接下来,我再结合一个深度学习的实际例子来深入解释。 例子:自然语言处理(NLP)中的词嵌入 假设我们正在构建一个文本分类器,这个分类器的目标是根据一篇文章的内容来判断它的类别(比如是体育、科技、新闻等)。在这个任务中,输入的数据是文本(比如一句话),而神经网络不能直接处理文字,它只能处理数值。所以我们需要把这些文字转换成模型可以理解的形式——这就是嵌入层的任务。 1. 文本的数值化 首先,假设我们有以下一句话作为输入: “苹果是一家科技公司。” 我们要让模型理解这句话,首先要把每个词(如“苹果”、“科技”、“公司”)转化为数字。可以使用词典方法,比如给每个词分配一个独特的编号: 苹果 -> 1 是 -> 2 一家 -> 3 科技 -> 4 公司 -> 5 这就将原句转换成了一个数字序列: [1, 2, 3, 4, 5] 2. 嵌入层的工作 单纯的数字序列是没有实际意义的,它只是词的编号,没有表达出词与词之间的关系。嵌入层的作用就是将这些编号转化为可以表达词语“特征”的向量。 假设我们有一个嵌入层,它将每个词的编号转化为一个3维向量(实际应用中,维度通常更高,比如100维或300维)。嵌入层会学到每个词在特征空间中的表示,比如: “苹果” -> [0.7, 0.1, 0.9] (可能表示它是一个具体的公司名) “科技” -> [0.3, 0.9, 0.4] (可能表示它与技术相关) “公司” -> [0.6, 0.2, 0.8] (可能表示它是一个组织) 这些向量不仅仅是随机的,而是嵌入层在训练过程中学到的,能够捕捉每个词的语义信息。比如,“苹果”这个词的向量可能会接近其他公司名称的向量,而“科技”会接近与技术相关的词汇。 3. 嵌入层的好处 嵌入层不仅能让模型处理文本,还能让模型自动学到词与词之间的语义关系。例如,经过训练后,模型可以学到: “苹果”和“微软”有相似的向量表示,因为它们都是科技公司; “科技”和“创新”也会有相似的向量,因为它们在语义上相关。 这意味着模型不仅仅看懂了字面意思,还能理解更深层次的语义信息。这种表示方法能显著提升模型的准确性。 总结 嵌入层在这个例子中的作用是:将原本简单的词的编号转化为包含语义信息的向量表示,这样神经网络就可以学习到词与词之间的关系,提升模型对文本的理解能力。 通过这个实际例子,你可以看到嵌入层是如何在深度学习中将“离散”的信息(如单词)变成“连续”的数值表示,帮助模型更好地学习和推理。

九月 13, 2024 · 1 分钟

Andrej Karpathy 的 Neural Networks: Zero to Hero 系列视频笔记:2 - Makemore

原视频: The spelled-out intro to language modeling: building makemore 注意,可以透过将代码复制到 colab 或 jupyter notebook 运行, 部分生图的输出结果本文贴图效果不佳,所以建议亲自动手跟着视频操作理解。本文的笔记仅作参考。 目标 Makemore 接收一个文本文件(例如提供的 names.txt),其中每一行都假定为一个训练“对象”。 然后,它生成更多类似的东西。 在内部,Makemore 是一个字符级语言模型。每一行都包含一个示例,即模型中的一系列单个字符。 这是Makemore操作的层面,试图预测序列/单词中的下一个字符。 Makemore 是一个以现代方式实现的字符级语言建模工具。 我们的目标是从零开始构建Makemore,并理解其工作原理。 import torch import torch.nn.functional as F import matplotlib.pyplot as plt %matplotlib inline device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Use GPU if available (faster calculations with PyTorch) words = open('names.txt', 'r').read().splitlines() #Python list of strings print("First 10 names: ", words[:10]) # First ten names, each as separate string print("Dataset size: ", len(words)) # Amount of words in dataset print("Shortest name: ", min(len(w) for w in words)) # Smallest word in dataset print("Longest name: ", max(len(w) for w in words)) # Longest word in dataset First 10 names: ['emma', 'olivia', 'ava', 'isabella', 'sophia', 'charlotte', 'mia', 'amelia', 'harper', 'evelyn'] Dataset size: 32033 Shortest name: 2 Longest name: 15 采用字符级方法,每个单词实际上是一组打包的示例,这些示例说明了哪个字符跟在哪个字符后面 / 哪个字符先出现 / 字符序列中大概有多少字符。...

九月 12, 2024 · 21 分钟

Andrej Karpathy 的 Neural Networks: Zero to Hero 系列视频笔记:1 - Micrograd

原视频: The spelled-out intro to neural networks and backpropagation: building micrograd 注意,可以透过将代码复制到 colab 或 jupyter notebook 运行, 部分生图的输出结果本文贴图效果不佳,所以建议亲自动手跟着视频操作理解。本文的笔记仅作参考。 import os import math import torch import numpy as np import matplotlib.pyplot as plt %matplotlib inline 目的 目标是理解对于micrograd示例中的神经网络(Neural Network, NN)定义、训练和反向传播(backprop)是什么样子的。这个教程基本上是一个逐步的项目演示。 Micrograd是一个自动微分引擎(Autograd engine),它仅用150行代码就包含了训练神经网络的所有必要元素。 Micrograd还从头实现了反向传播(Backpropagation)。 反向传播允许你迭代调整神经网络的权重,以最小化给定的损失函数/提高预测准确性。 什么是 Micrograd? Micrograd是一个小巧友好的自动微分引擎,支持自动微分和高阶导数计算。 它由不到150行的Python代码组成,是理解通用自动微分引擎工作原理的有效学习工具。 简单的使用示例: from micrograd.engine import Value a = Value(-4.0) # create a "Value" object b = Value(2.0) c = a + b # transform a and b into c with "+" c += c + 1 c += 1 + c + (-a) print(c....

九月 11, 2024 · 21 分钟

OMR 相关论文阅读:基于端到端线性化编码的钢琴乐谱光学识别技术

核心观点 1. 研究背景 (Background of the Study): 文章探讨了如何通过深度学习方法实现光学音乐识别 (OMR) 的端到端系统,尤其是针对钢琴形式音乐的识别。尽管近年来在单声部音乐的光学识别方面取得了进展,但现有的 OMR 模型很难处理钢琴音乐中包含的多声部和多行谱表。 钢琴音乐的复杂性源于其多声部的独立并行,声部可以在乐曲中自由出现和消失。这种复杂性给 OMR 模型的输出带来了额外的挑战。 2. 核心贡献 (Key Contributions): Linearized MusicXML 编码: 提出了一个线性化的 MusicXML 格式 (Linearized MusicXML),以便端到端模型直接训练,同时保持与行业标准 MusicXML 格式的紧密一致性。 这种编码方法通过对 XML 树进行深度优先遍历,并将每个元素转换为相应的令牌,从而减少冗余,专注于乐谱的视觉表示,抑制语义信息并忽略声音、布局和元数据。 数据集构建与测试: 构建了一个基于 OpenScore Lieder 语料库的钢琴音乐基准测试集,包含合成训练图像和来自公共 IMSLP 扫描的真实世界图像。 数据集包括两种变体:合成和扫描,分别用于训练、开发和测试。合成数据用于模型的初始训练,扫描数据用于测试模型的真实性能。 模型训练与优化: 使用新的基于 LSTM 的模型架构进行训练,并进行了精调以作为基准。 模型在合成和扫描的测试集上都表现出色,显著超越了现有的钢琴音乐数据集上的最先进结果。 评价指标与结果分析: 采用 TEDn 度量模型来评估输出的 MusicXML 文件,并与当前最先进的结果进行比较,证明了新的编码和模型架构在钢琴音乐 OMR 任务中的有效性。 结果表明,使用 LMX 线性化的端到端 OMR 系统在钢琴音乐识别中达到了最先进的性能。 3. 技术实现 (Technical Implementation): 模型架构: 文章提出了一种新的 LSTM 解码器与 Bahdanou 注意力机制相结合的序列到序列架构,用于钢琴音乐的光学识别。 该模型首先通过多个卷积层处理输入图像,然后通过双向 LSTM 层进行上下文化,最后使用带有注意力机制的 LSTM 解码器生成输出。 数据增强与训练策略: 针对合成数据与真实扫描数据的差异,设计了一系列数据增强操作,如水平位移、旋转、垂直位移等,以提高模型的泛化能力。...

八月 27, 2024 · 2 分钟