2024-08-29 | 阅读全文

2024-08-29 | 阅读全文

为 Litchi 添加配置功能

2024-08-28 | 阅读全文

A Story About Litchi

2024-08-24 | 阅读全文

Schmidt and Google

2024-08-17 | 猪猪可能到死都以为,自己还不够努力…… 阅读全文

GGML PCA

2024-06-23 | 主成分分析(principal components analysis)是一类非常常见的算法,广泛应用于各种需要信息压缩的场景。虽然《深度学习》一书称之为“简单的机器学习算法”,但是PCA通常可以通过确定的数值算法实现。 阅读全文

Tensor Dancer 项目的开发环境配置

2024-06-14 | 我准备围绕几个基础的算法工具,编写一系列算法,最终形成一个高阶的算法库,并提供相关的 PostgreSQL 插件,这里记录一下开发环境配置 阅读全文

在 PG 中支持矩阵乘法

2024-06-14 | Tensor Dancer 项目核心目标之一,是在 PostgreSQL 中提供张量计算能力。这里我们从一个最简单的需求开始:支持矩阵乘法,使我们可以对 pgvector 的向量使用 PCA 矩阵降维。 阅读全文

一次不成功的 pull request

2024-06-05 | 或许,解决ollama嵌入向量的降维问题,已经没有简单的路可以走了 阅读全文

Java Llama CPP On MacOS

2024-05-15 | 阅读全文

个人版 AI 辅助系统的尝试

2023-12-16 | The Old Dwarf Forged A New Toy In His Mountain Workshop 阅读全文

Arg Parser

2023-12-11 | A simple arguments parser base special rules and Jaskell style 阅读全文
Tags: java jaskell


为 Java 编写的 Try 和 Tuple 类型

2023-12-02 | Java 传统上使用 try catch finally 关键字管理异常。这种机制久经考验。我参考 scala 的 Try 类型,编写了一组适用 java 的工具。 阅读全文

Croupier

2023-04-01 | Random select utils 阅读全文

《数据可视化基础》读后感

2022-12-05 | 这本书分门别类的介绍了各种主要的图表类型和对应的适用场景,给出了各种好和不好的设计示范。 阅读全文
Tags: tech data


《通向实在之路》

2022-11-13 | 近一段时间,我的各个开源项目都没有什么提交,在这段时间,我读完了《通向实在之路——宇宙法则的完全指南》。 阅读全文
Tags: math


Common Lang3 Bridge 发布第一个版本

2022-09-14 | 就在今天,我发布了 Apache Commons Lang Bridge 的第一个版本 阅读全文

Apache Commons Lang3 Bridge 未(完全)实现的内容

2022-09-05 | 实现这个封装库时,并非无条件的照搬,而是做了一定的取舍。 阅读全文

Jaskell Dotty

2021-11-27 | 面向下一代 Scala 的 Jaskell 实现 阅读全文

Jaskell Core 0.3

2020-05-21 | 我和代数组合子的十年 阅读全文
Tags: Scala Java Parsec


MAC OS 使用技巧二则

2013-10-26 | NTFS访问,磁盘空间丢失,是我在使用 Mac 时遇到的问题,也是 MAC 用户常见的问题。不过当时因为没有及时记录,现在的印象有些模糊了。特别是一些原理和名词未必准确。 阅读全文
Tags: tech OSX


搭建 SAE 本地开发环境

2013-10-09 | 现在在本地,特别是*nix系统下搭建SAE开发环境,已经是一个相当方便的事情。 阅读全文
Tags: tech web python


LVM Extend Or Reduce

2013-08-26 | LVM 容量伸缩控制可以热调整,而这只依赖很简单的几个指令 阅读全文

昔年旧日

2013-08-23 | 一桩旧事 阅读全文
Tags: live other


《iOS 编程(第三版)》书评

2013-07-24 | 这本书比我以前读过的 step by step 的读物更深入一些,而不失易于学习的优点。 阅读全文

WWDC 和Apple新一代操作系统族

2013-06-17 | WWDC 2013,后 Jobs 时代的标志典礼 阅读全文
Tags: tech iOS OSX


诚聘全职漫画助理【珠海】

2013-04-08 | 阅读全文
Tags: 招聘


大脚文件下载链接错误

2013-03-11 |
````
阅读全文
Tags: tech


帮朋友发个招聘启事(优逸科技)

2013-03-07 | 优逸科技招聘高级软件开发人才。 阅读全文
Tags: 招聘


如何给 Jekyll 的 Post 设定附图

2013-02-27 | Jeklly 站点的页面可以附加元信息,用这种方法可以很方便的给Post设定附图。
````
阅读全文
Tags: tech web jekyll


我用 Jekyll 重构了 Dwarf Artisan

2013-02-25 | 最初紧急搭建的公司网站已经越来越难以满足要求,我重构了 Dwarf Artisan 的网站。 阅读全文
Tags: tech web jekyll


我的键盘体验

2013-02-22 | 我个人关于键盘的选择和使用习惯的体验。 阅读全文
Tags: 其它


每天都被老婆打

2013-02-17 | 每天都被老婆打什么的…才没有呢!只是单纯的秀恩爱,哼! 阅读全文
Tags: live family joke


Python TDD IN EMACS

2013-02-17 | Emacs有非常强大的扩展能力,可以用它和iPython组合成为Python的TDD式开发环境。 阅读全文

How To Create a HTTP PUT use Python

2013-02-17 | 旧文搬家,用Python构造HTTP PUT请求的代码 阅读全文
Tags: python web


Notes of Write Scheme 48 Hours

2013-02-13 | 这是一份学习笔记,《48 Hours》通过开发一个 Scheme 解释器介绍了 Haskell 语言 阅读全文

About

2013-02-12 | 关于这个坑 阅读全文
Tags: 关于 其它


How To Read Mathematics 如何阅读数学

2013-02-08 | 未经启蒙的话,数学是门无法阅读又无法理解的语言 阅读全文

为什么会有这个坑

2013-02-07 | 阅读全文
Tags: 其它

  • GGML PCA

    主成分分析 主成分分析(principal components analysis)是一类非常常见的算法,广泛应用于各种需要信息压缩的场景。虽然《深度学习》一书称之为“简单的机器学习算法”,但是PCA通常可以通过确定的数值算法实现。 概略来说,PCA是找到一个映射算法,将高维空间的样本集合在尽量不损失信息的前提下,映射到更低的维度,从N维空间映射到M维空间,可以表示为一个 $M*N$的矩阵。PCA的目的就是通过分析样本集合,解出这个映射矩阵。 这个求解过程主要有这样几个步骤: 将样本集合表达为$样本数特征数$($AF$)的矩阵 将这个矩阵规范化,使后续步骤中我们可以得到一个对角线为1的协方差矩阵,这需要先得到无偏的标准差: 我们先求得样本集的均值向量,均值向量的每个维度都是所有样本在该特征维度的值的平均 用样本集减去这个均值向量,得到一组中心化的数据$B$ 对这个集合求平方,然后求和,再除以$A-1$得到无偏方差 开方得到无偏标准差(Unbiased standard deviation)即样本标准差(Samples standard deviation) 。 为了避免样本标准差的某个维度为0,导致后续计算出错,可以给它加上一个极小的正数作为补偿。 用B矩阵除以标准差 得到规范化的矩阵X之后,我们计算 $X^TX$ 将得到的矩阵除以$A-1$,得到$F*F$的协方差矩阵 求解协方差矩阵的奇异值矩阵$S$和右奇异值$VT$向量矩阵,按从奇异值大到小,取对应的前M个向量,组成PCA转换矩阵 使用这个矩阵,对样本做矩阵乘法时,得到的就是降维后的结果向量。 实现 我最初做PCA算法的动机,来自于将 4096 维度的 ollama 嵌入向量降维到 2000 维以下——我的目标是256,那么在这个计算过程中,如果假设样本集数量为一万,计算过程中就会涉及好几次千万级的浮点数乘法。为了加速计算过程,使之可以优化到足以放到 PostgreSQL 内部使用,我使用AI框架 ggml 实现了一个 PCA 方法。 GGML 是一个 C 库,它支持 CUDA、MPX 等硬件加速方案,可以快速处理大规模的矩阵算法。 GGML 的tensor类型支持最多4个张量维度,PCA仅涉及矩阵和向量计算,只需要用到最多两位维度。所以这里仅使用GGML TENSOR的前两个维度。 在前述步骤中,基础的矩阵算法如乘法,加法等都有对应的 GGML... [Read More]
  • Tensor Dancer 项目的开发环境配置

    环境和依赖 我准备围绕几个基础的算法工具,编写一系列算法,最终形成一个高阶的算法库,并提供相关的 PostgreSQL 插件。 这个系列,我们主要依赖三个第三方库,线性代数计算库BLAS、LAPACK和GGML。 BLAS 全称 Basic Linear Algebra Subprograms ,底层基于 Fortran 代码,是众多线性代数库的基石。 LAPACK 全称Linear Algebra PACKage,基于 BLAS 库开发,提供了一些矩阵计算算法实现,例如SDV分解。 我的日常工作在一台 M3 芯片的 Apple MacBook 笔记本上完成,因此这里也主要围绕 MacOS 展开,兼顾 Linux。不过我手头没有 Navida 显卡,也没有 CUDA 的运行环境,这方面的东西无法实验。 开发工具 BLAS 和 LAPACK 本身有系统内置的版本,但是实验来看,连编时会找不到头文件,好在它们也有 homebrew 版本,可以直接安装。但是ggml 要程序员自己编译。因此我们还是从开发工具的准备开始。 首先,我们需要安装 Apple 的开发工具集,这个不多介绍,Apple Store上现在可以直接下载xcode……嗯我大概是这个世界上少数在apple store上花过45块钱买xcode的苹果用户了。现在xcode是个免费软件。 说个好笑的,xcode和 xcode-commandline 的库搜索路径不一样,我也是在编译 llama.cpp... [Read More]
  • 在 PG 中支持矩阵乘法

    在 PG 中支持矩阵乘法 Tensor Dancer 项目核心目标之一,是在 PostgreSQL 中提供张量计算能力。这里我们从一个最简单的需求开始:支持矩阵乘法,使我们可以对 pgvector 的向量使用 PCA 矩阵降维。 关键代码 将一个n维向量V降到m维,可以简单的理解为用一个 n*m的矩阵 T 乘以 n 的转置, $$ 这是一个非常基本的线性代数算法,在 BLAS 库中提供了通用的矩阵乘法。我们可以简单的调用这个函数。 int mul_matrix_vector_f32(struct Matrix *matrix, float *vector, float *result) { cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, (int) matrix->rows, 1, (int) matrix->columns, 1.0, (float *) matrix->data, (int) matrix->columns, vector, 1, 0.0, result,... [Read More]
  • 一次不成功的 pull request

    一次不成功的 pull request 昨天,我向 pgvector 提交的一个降维算法被拒绝了 Submit a simple vector dimensionality reduction function 。 这个结果对我来说,并不意外。顶多算是略有遗憾。我习惯使用ollama ,而ollama的embedding接口返回的是4096维度,远大于PGVector索引支持的最大维度2000。关于这个问题,我第一个想法是修改PGVector的维度限制,不过这个issue很快被拒绝了 Increased max dimensions for index from 2000 to 4096 。原因也很简单,PGVector这个限制其实来自PostgreSQL,PG的索引页最大为8K,所以PGVector的索引维度最大不能超过2000。 在此之后,我就开始尝试实现一个实用的降维算法。 一般来说,PCA(主成分分析)总是被首先推荐的,这玩意儿甚至是花书的一个重要示例。但是我并没有将 PCA 作为首选。这是因为: PCA 基于样本空间进行降维,但是我希望首先有一个不依赖预备知识,可以直接对任意向量进行降维操作的算法。 当然,完全零知识的前提下是无法有效降维的,我希望的是首先找到一个足够简单,但是对 ollama 的嵌入向量有效的压缩算法,可以将这些 4096 维的向量压缩到 256甚至更低的维度,但是仍然可以足够有效的用于 RAG 应用。如果能做到第一步,再继续尝试对其它类似的embedding向量构造算法。这样我就可以无状态的使用它。 PGVector并不是一个很大的项目,我希望我的降维算法也足够简单,可以不依赖很重的外部资源,使用朴素的c语言实现。而PCA需要计算协方差和特征值或奇异值矩阵,这需要引入LAPACK和BLAS库,或者自己写出相关的算法。 因此,我尝试了一些朴素的,甚至可以说是非常朴素的算法。例如对m维降到n维的,直接用 n/m 划分原向量,再对每一组取平均值(我称之为norm 或 integral reduce)。再比如先算出相邻维度的差分,然后找到前n-1个最大的差分,以此为边界将原向量分割为n份,再求平均值——我称之为diff reduce——这多少有点儿像PCA,没办法,对一个向量(1xN矩阵),实在没办法求特征值,我看到的同行的实现,都是加入了一些白噪声维度再计算PCA,而这比我期待的还是重了一些。 我的意思是,关于PG的浮点数计算,我有很多有野心的想法,但是目前我希望写出一个足够小的函数,可以让PGVector社区毫无压力的接受它。所以我重点实验了一下几种不需要样本数据集,不需要引入额外维度,不需要ggml,也不需要lapack之类的算法库支持的微型算法。 很意外,效果最好的,居然是最简单的按固定区间分组求平均值的算法——我称之为... [Read More]