thinklive

dirichlet library

欢迎来到迪瑞克拉

这里是thinklive的个人博客,不定时地会发一些个人技术学习心得和生活体会,申请友链可邮件联系
使用左侧的分类来定位内容
为了响应环保号召,并且给你的电脑省点电,推荐禁止浏览器的js功能,例如firefox浏览器可下载disable javascript插件禁用js
这意味着该网站的动态功能全部瘫痪,包括背景动效,加密页面,左侧的时钟,游戏等页面,但浏览普通博文的功能保持正常
可以通过左下角的"🌓"按钮切换白天/黑夜模式(功能测试中)
有时可能出现latex数学公式不渲染的bug,这时一般刷新页面就可以解决

建站指北

菜单的资源地图神龛是迪瑞克拉子站,分别用于存放资源网站和随笔,主站主要存放学习笔记或者一些公开的创作

迪瑞克拉的由来

狄利克雷函数(英语:dirichlet function)是一个定义在实数范围上、值域不连续的函数。狄利克雷函数的图像以Y轴为对称轴,是一个偶函数,它处处不连续,处处极限不存在,不可黎曼积分。这是一个处处不连续的可测函数。

在我看来它象征着混沌,不可知与无限的可能性,狄利克雷换一种方式音译就成了迪瑞克拉

更新日志

阅读全文 »

基础概念

强化学习和监督学习的区别:

  1. 强化学习输入的样本是序列数据,监督学习的样本之间相互独立
  2. 没有明确的监督者,通过奖励机制进行学习,但回馈可能是长期的,模糊的

一些强化学习的演示视频中,ai会做一些人类看来无意义的动作,正是这种“玄学”的回馈机制导致的

  • actor: 行为主体
    • action则可分为离散和连续,例如2d游戏中走格子迷宫就是一个典型的离散动作空间
  • observaton o /states s: 观测与状态
    • 观测到的情况o和现实情况(状态s)其实有可能不同,假设可以观察到全景,rl则成为一个马尔科夫决策过程
  • policy π: 行为策略
    • 带有参数θ
  • reward:反馈
    • baseline: 避免总是正值的reward,增加的偏置值,例如取期望
  • episode: 一轮行动
  • trajectory τ: \(\tau=\{s_{1},a_{1},s_{2},a_{2},\cdots,s_{T},a_{T}\}\)
  • 折扣γ: 直觉上,最开始的训练回馈可能更重要,越往后则训练收益越小,所以对每步的回馈可以乘以一个 \(\gamma^{t-1}\),t为训练次数,这个超参数也可以用于控制训练策略偏短期还是偏长期
阅读全文 »

前置知识

ES

ES modules 是原生 JavaScript 提供的模块功能,逐渐被更多的浏览器支持
形如:

1
2
3
4
5
6
7
8
9

<script type="module">
<!-- something -->
</script>

<script>
import { x,y } from './module.js
</script>

vue基础

应用

每个 Vue 应用都是通过createApp函数创建一个新的应用实例,例如:

1
2
3
4
import { createApp } from 'vue'
import App from './App.vue'

const app = createApp({App})

createApp 的对象实际上是一个组件,每个应用都需要一个“根组件”,其他组件将作为其子组件,最后得到一个树状结构

模板

当根组件没有设置 template 选项时,Vue 将自动使用容器的 innerHTML 作为模板
模板中可以使用指令,指令由 v- 作为前缀,表明它们是一些由 Vue 提供的特殊 attribute,指令最常用的功能是绑定html属性到某个元素
双大括号会将数据解释为纯文本,而不是 HTML。若想插入 HTML,需要使用 v-html 指令:
<span v-html="rawHtml"></span></p>

想要响应式地绑定一个 attribute,应该使用 v-bind 指令<div v-bind:id="dynamicId"></div>
简写语法为:<div :id="dynamicId"></div> 同名简写(3.4以上版本):<div :id></div> js表达式支持:

1
2
3
4
5
6

{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div :id="`list-${id}`"></div>

响应式

这里使用选项式api,使用data 选项来声明组件的响应式状态。此选项的值应为返回一个对象的函数
在 Vue 3 中,数据是基于JavaScript Proxy 实现响应式的,也就是通过一个代理来更新对象状态,vue3中原始对象不会变成响应式代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

export default {
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count++
}
},
mounted() {
// 在其他方法或是生命周期中也可以调用方法
this.increment()
}
}

Vue 自动为 methods 中的方法绑定了永远指向组件实例的 this,且嵌套的对象变化也能相应,也就是类似json的格式可以随意修改
当你修改了响应式状态时,DOM 会被自动更新。但是需要注意的是,DOM 更新不是同步的。Vue 会在“next tick”更新周期中缓冲所有状态的修改,以确保不管你进行了多少次状态修改,每个组件都只会被更新一次

创建有自己状态的方法:
如果需要多个有独立状态的方法,则要在created期间创建这样的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

export default {
created() {
// 每个实例都有了自己的预置防抖的处理函数
this.debouncedClick = _.debounce(this.click, 500)
},
unmounted() {
// 最好是在组件卸载时
// 清除掉防抖计时器
this.debouncedClick.cancel()
},
methods: {
click() {
// ... 对点击的响应 ...
}
}
}

常用api

vue内置指令 常用的用v-bind,v-model,v-if,v-for等,语法都很符合直觉 在组合式 API 中,通过setup脚本块来初始化需要的数据和函数(包括响应式状态),常用 ref() 函数来声明响应式状态:const count = ref(0) 脚本中访问count的值需要解包,即通过count.value访问,但在模板块中可以自动解包(只有顶级的 ref 属性才会被解包,被包裹在一个列表中的ref不会解包)

要在组件模板中访问 ref,需要从组件的 setup() 函数中声明并返回它们:

1
2
3
4
5
6
7
8
9
10
11
12
13
import { ref } from 'vue'

export default {
// `setup` 是一个特殊的钩子,专门用于组合式 API。
setup() {
const count = ref(0)

// 将 ref 暴露给模板
return {
count
}
}
}

计算属性 ref:形如以下的ref,computed() 方法期望接收一个 getter 函数,返回值为一个计算属性 ref,用法类似数据的ref,与function的区别是能追踪响应式状态,且响应式状态不改变就不会重新计算

1
2
3
const publishedBooksMessage = computed(() => {
return author.books.length > 0 ? 'Yes' : 'No'
})

路由

创建: history 选项控制了路由和 URL 路径是如何双向映射的,详见不同的历史记录模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { createMemoryHistory, createRouter } from 'vue-router'

import HomeView from './HomeView.vue'
import AboutView from './AboutView.vue'

const routes = [
{ path: '/', component: HomeView },
{ path: '/about', component: AboutView },
]

const router = createRouter({
history: createMemoryHistory(),
routes,
})

路由作为一个插件被使用:

1
2
3
const app = createApp(App)
app.use(router)
app.mount('#app')
组合式api中,用useRouter() ;useRoute()两个函数获取路由器实例和当前路由;组件 RouterViewRouterLink 都是全局注册的,可以直接调用,最简单地做法是APP.vue直接整个渲染当前路径的RouterView routes可以使用参数或者正则匹配,详见官网文档

Pinia

Pinia 是 Vue 的专属状态管理库,可以帮助我们管理共享状态,也就是一些我们希望定义在组件外部,全局可用的状态
引入:

1
2
3
4
5
6
7
8
9
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const pinia = createPinia()
const app = createApp(App)

app.use(pinia)
app.mount('#app')

A Survey on RAG Meeting LLMs: Towards Retrieval-Augmented Large Language Models

检索技术被用来面对输入查询时提取相关的外部信息,其典型的应用场景就是谷歌百度这样的搜索引擎。而近来火热的生成式模型面临的场景问题——幻觉,也可以一定程度上用检索技术解决

retrieval 可分为 sparse and dense, 标准是对信息的编码方式,前者基于词语,也就是直接当做文本信息,后者会使用词嵌入,将信息编码进向量空间,更为复杂
spares: 常用的方法是使用术语和逆文档频率排序,选取相关度最高的,也会被用于提供上下文学习的证明,缺点是对术语的依赖性较强
dense: 与前者不同,以词嵌入为搜索标准,例如依据semantic similarity,选取最相似的,实例有BERT-based backbone 等

Retrieval Granularity: 粒度的选取非常重要,会影响模型的性能和效率表现,数据库的检索和计算开销等
早期的检索增强语言模型倾向于检索出整段文档,模型学习检索到的文档,并在其中定位答案
近年常用的有Chunk retrieval, token retrieval(检索更快,但数据库压力较大,适合模式稀有且需要不常用领域数据的情况)

机器学习

  • stochastic 随机的
  • hallucinations 幻觉
  • paradigm 范式
  • Modular 模块化
  • augmentation 增强
  • scalability 可拓展性
  • proprietary 专有
  • fine-tuning 微调
  • parameterize 参数化
  • corpora 语料库
  • downstream
  • domain-specific
  • sample space 样本空间
  • outcome space 结果空间
  • mutually exclusive 互斥
  • stochastic gradient descent 随机梯度下降法
  • granularity 粒度
  • Cross-site scripting 跨站脚本
  • off-the-shelf 现成的

算法与数据结构常用术语

阅读全文 »

李宏毅机器学习 动手学深度学习

前期工作

数学

概率论

数学期望:

\[E[X]=\sum_{x}x P(X=x).\]

当函数f(x)的输入是从分布P中抽取的随机变量时,f(x)的期望值为:

\[E_{x\sim P}[f(x)]=\sum_{x}f(x)P(x).\]

方差:

\[\operatorname{Var}[X]=E\left[(X-E[X])^{2}\right]=E[X^{2}]-E[X]^{2}.\]

分布

信息论

在不同的领域中,熵被表示为混乱程度,不确定性,惊奇程度,不可预测性,信息量等,但在机器学习中我们只需要对信息论中的熵有基本了解
信息论中熵的概念首次被香农提出,目的是寻找一种高效/无损地编码信息的方法,即无损编码事件信息的最小平均编码长度 即信息熵H(X) = -Σ p(x) log2 p(x) (p为概率)

接下来说明这个公式,假设我们用二进制的哈夫曼编码,一个信息出现概率是1/2,即其他所有情况加起来也是1/2,那么我们会发现其编码长度必然是-log(1/2),也就是1,恰好和我们的香农熵定义一致了,这是为什么呢?
严谨的数学证明超出了cs专业范围,这里只说一下直观理解,熵有两个性质:

  • 概率越小信息量越大(如果一个小概率事件发生了,就排除了非常多其他可能性)
  • 假设两个随机变量x,y相互独立,那么分别观测两个变量得到的信息量应该和同时观测两个变量的信息量是相同的,h(x+y)=h(x)+h(y)

如此一来对数函数的负数完美符合条件,基数则无所谓,直观地理解,基数对应用几进制编码,而要最短化编码,越小概率就应该用更长的位数,把短位数腾出来给大概率事件用,当然实际中编码的位数是离散的,而且相比对数取负只能多不能少,因此香农熵是一个理论最优值,熵编码就指无损情况下的编码方式,最常用的就是哈夫曼编码,所有熵编码方式的编码长度大于等于香农熵

现实中常用二进制编码信息,例如对8种不同的信息,最直观的编码是三位二进制,每三位表示一个独特信息。
我们可以用概率表示每种信息出现的可能,例如8种信息,每个都等可能出现,那么以概率为权的哈夫曼编码就会用所有的3位二进制编码这8种信息,熵就是3,而其他情况熵可以当做哈夫曼树的总编码长度算
那么如何理解熵能反映混乱度呢?如果熵比较大(即平均编码长度较长),意味着这一信息有较多的可能状态,相应的每个状态的可能性比较低;因此每当来了一个新的信息,我们很难对其作出准确预测,即有着比较大的混乱程度/不确定性/不可预测性

交叉熵
交叉熵用于评估估计概率得到的熵与真实熵的差距,交叉的含义很直观,就是使用P计算期望,使用Q计算编码长度
为什么这么选而不是反过来呢?这取决于我们的目的,一般来说,我们希望估计的编码长度和理论最优的熵差距较小,要比对取优的主要是模型的编码长度即logQ,可以这么理解,熵公式中的对数函数视为视为对一个特定概率事件的编码长度,由于现实的概率分布实际上是确定的,那么需要评估的也就是编码方式的效率
由于熵是给定概率分布下的最优值,交叉熵只可能大于等于熵,两者差越小或者说交叉熵越小表示模型估计越准
例如在最极端的one-hot编码中,交叉熵等价于对应正确解标签的输出的自然对数

线性代数

范数

范数是具有“长度”概念的函数,用于衡量一个矢量的大小(测量矢量的测度)
由于不是数学系的,这里就极为不严谨地记录一下范数的理解:

  • 0范数,向量中非零元素的个数
  • 1范数,为绝对值之和
  • 2范数,就是通常意义上的模

正则化的目的可以理解为限制权重向量的复杂度,实际做法为在损失函数中加入与权重向量复杂度有关的惩罚项,而范数在某种意义上可以反映这点,因此可作为选取正则项的依据
顺便一提a star算法也会用类似的测度估计距离

工具

cuda

Compute Unified Device Architecture (CUDA):简单地说,就是允许软件调用gpu来计算的一个接口
CUDA Runtime API vs. CUDA Driver API

  • 驱动版本需要≥运行时api版本
  • driver user-space modules需要和driver kernel modules版本一致
  • 当我们谈论cuda时,往往是说runtime api
阅读全文 »

一些pdf

阅读全文 »
0%