Skip to content

Commit

Permalink
12.5
Browse files Browse the repository at this point in the history
  • Loading branch information
yhtq committed Dec 5, 2024
1 parent 0d39413 commit 1ec5a82
Show file tree
Hide file tree
Showing 12 changed files with 1,285 additions and 6 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
忽略/**
**/**.zip
**/target
.VSCodeCounter/**
.VSCodeCounter/**
data/**
7 changes: 4 additions & 3 deletions 并行与分布式计算/上机报告/上机报告2.typ
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@
GCC 编译器可以自动利用向量化指令完成某些运算,但需要非常多的额外信息,包括内存对齐,非别名等等。编译时开启 `-fopt-info-vec-all` 可以帮助我们知道向量化失败的原因。本次实现的初版矩阵乘法为:
```cpp
template <int M, int N, int S, typename T>
Matrix<T, M, S> mul_parallel (const Matrix<T, M, N>& a, const Matrix<T, N, S>& b) {
Matrix<T, M, S> mul_parallel (const Matrix<T, M, N>& a, const Matrix<T, N, S>& b) {
if constexpr (debug){
if (a.ncols() != b.nrows()) {
fmt::print("Error: Matrix size not match!\n");
Expand All @@ -184,7 +184,7 @@ Matrix<T, M, S> mul_parallel (const Matrix<T, M, N>& a, const Matrix<T, N, S>& b
T* c_data = c.get();
const T* a_data = a.get();
const T* b_data = b.get();
以下 assume 可以帮助进行自动向量化
// 以下 assume 可以帮助进行自动向量化
__builtin_assume_aligned(c_data, BYTE_ALIGNMENT);
__builtin_assume_aligned(a_data, BYTE_ALIGNMENT);
__builtin_assume_aligned(b_data, BYTE_ALIGNMENT);
Expand Down Expand Up @@ -260,7 +260,7 @@ Matrix<T, M, S> mul_parallel (const Matrix<T, M, N>& a, const Matrix<T, N, S>& b
```
可以很大程度上避免忘记 gap 造成的 Bug
=== 循环展开
事实上,不难发现核心循环的最内层循环次数并不多,因此循环展开可能获得很大的收益。这里最开始担心编译器无法充分优化,手动写了一层展开:
不难发现核心循环的最内层循环次数并不多,因此循环展开可能获得很大的收益。这里最开始担心编译器无法充分优化,手动写了一层展开:
```cpp
// 由于一个 cache_line 事实上只有两个向量,我们手动展开
template<typename T>
Expand Down Expand Up @@ -507,4 +507,5 @@ Matrix<T, M, S> mul_parallel (const Matrix<T, M, N>& a, const Matrix<T, N, S>& b
- 线程数为 $1, 2, 4, 8$ 时,运行时间几乎线性下降,这和我们之前的分析是一致的。
- 线程数为 $16$ 时,并没有获得线性加速。推测是因为服务器使用的是 12 个逻辑核的 E5-2650 v4,对于矩阵乘法这样运算非常密集的任务,超线程带来的性能提升当然比不上物理线程。
- $m = n = p = 2048$ 时,矩阵乘法花费约 400ms,性能已经比较好。但是可以看到,与 1024 的实验相比,缓存失效率暴增,说明还有很大的优化空间。
- 每个实验中,分支预测失败率都非常低,这或许是编译器充分循环展开带来的收益。
- 每个实验中,平均一个 CPU 周期都完成了两条以上的指令,可见现代 CPU 为了尽可能提高性能,也做出了相当大的努力。
71 changes: 69 additions & 2 deletions 数理逻辑/main.typ
Original file line number Diff line number Diff line change
Expand Up @@ -1270,7 +1270,7 @@
]
#proposition[][
对于任何无穷基数 $m$,任何一致一阶系统都有基数为 $m$ 的模型
]
]<model-cardinality>
#theorem[Compactness][
若一个一阶系统 $S$ 的公理集的任何有限子集都有模型,则 $S$ 有模型
]
Expand Down Expand Up @@ -1364,4 +1364,71 @@
+ $1(1 1) = 1 := #transitivity-b(3, 4)$
]
]
]
]
== 一阶算术
#definition[算术语言][
定义一阶语言,包含:
- 常元: $0$
- 函项符: $s$(后继)$, +, *$
- 谓词符: $=$
以及公理:
+ N1: $not1 (s(x_1) = 0)$
+ N2: $s(x_1) = s(x_2) -> x_1 = x_2$
+ N3: $x_1 + 0 = x_1$
+ N4: $x_1 + s(x_2) = s(x_1 + x_2)$
+ N5: $x_1 * 1 = x_1$
+ N6: $x_1 * s(x_2) = x_1 * x_2 + x_1$
+ N7: $calA(0) -> (forall x_1 (calA(x_1) -> calA(s(x_1)))) -> (forall x_1 calA(x_1))$,其中 $x_1$$calA$ 中自由出现

$0^((n))$ 代表 $0$$n$ 次后继。显然它是一个闭项。
一般的,称包含上面定理和公理产生的定理集的一阶理论为一阶算术。
]
注意 N7 理论上不等价于通常的 Peano 公理中的数学归纳法,后者讨论的是所有自然数子集上的性质,这是不可枚举的。而 N7 只是公理模式,它是可数多个公理。
#lemma[][
$m = n <=> 0^((m)) = 0^((n))$
]
#proof[
使用归纳法即可
]
#proposition[][
任何 $NN$ 的模型都是无穷的。
]
显然,通常的自然数就是一阶算术的一个模型。看起来,这可以表明 $NN$ 是一致的系统。然而,“通常的自然数”这个说法本身依赖于其他数学基础(如何定义自然数),这是不可靠的。事实上,如果这确实是标准模型,可以想象其他任何模型和标准模型几乎没有区别。因此只要 $NN$ 是一致的,它就几乎是完全的。
#theorem[Godel 不完全性定理][
算术系统 $NN$ 是不完全的
]
它的证明我们后面会介绍
== 形式集合论
在朴素集论中,人们遇到了 Russel 悖论。为了消除 Russel 悖论,主要有两种思路。一种是 Russel 自己提出的类型论,但在数学中更常见的是 Zermelo-Fraenkel 公理集合论。
#definition[一阶 ZF 语言][
定义 ZF 语言:
- 没有常元或函项符
- 谓词符: $=, in$
- 常用的缩写:
- $t_1 subset.eq t_2 := forall x_1 (x_1 in t_1 -> x in t_2)$
- $t_1 subset t_2 := t_1 subset.eq t_2 and t_1 != t_2$
- 公理:
+ ZF1: $x_1 = x_2 <-> forall x_3 (x_3 in x_1 <-> x_3 in x_2)$(外延公理)(作为推论,可以证明 $x_1 = x_2 <-> x_1 subset.eq x_2 and x_2 subset.eq x_1$
+ ZF2: $exists x_1, forall x_2, not1 x_2 in x_1$(空集公理)(事实上,由 Z1 可以证明在规范模型中,空集是唯一的,因此往往记作 $emptyset$
+ ZF3: $exists x_3 forall x_4 (x_4 in x_3 <-> x_4 = x_1 or x_4 = x_2 )$(对集公理)(事实上,可以证明是存在唯一的,因此往往将其记作 ${x_1, x_2}$
+ ZF4: $exists x_2, forall x_3 (x_3 in x_2 <-> exists x_4 (x_4 in x_1 and x_3 in x_4))$(并集公理,存在一个集合是某个集合所有元素的并,进而可以定义 $t_1 union t_2 := union.big {t_1, t_2}$
+ ZF5: $exists x_2 (forall x_3, x_3 in x_2 <-> x_3 subset x_1)$(幂集公理,存在集合是某个集合的所有子集的集合)
+ ZF6: $(forall x_1, exists_1 x_2 calA(x_1, x_2)) -> (forall x_3 exists x_4 forall x_5(x_5 in x_4 <-> exists x_6 (x_6 in x_3 and calA(x_6, x_5))))$(替换公理模式,相当于对于任意集合 $x$ 和"函项" $f$,都存在集合 $f(x)$
+ ZF7: $exists x_1 (emptyset in x_1 and (forall x_2 (x_2 in x_1 -> x_2 union {x_2} in x_1)))$(无穷公理,也就是无穷集(归纳集)存在)
]
#remark[][
- ZF 公理体系中没有非集合的个体,但事实上也可以加入非集合的个体,这种扩充往往称为 ZFA
]
*假设 ZF 是一致的,也即存在模型*,则以它的规范模型为基础,可以建立所有数学的基础。

除了 ZF 的公理外,还有一些已经被证明独立于 ZF (换言之,若 ZF 是一致的,则加上它们之后一致的)的公式,包括:
- 选择公理(等价于 Zorn 引理和良序定理)
- 连续统假设(CH)

人们往往认为,以集为数学基础是安全的。哪怕 ZF 系统被发现存在悖论,也能通过添加公理排除掉。如果我们把朴素集称为类,则可以将不是 ZFC 中的集合的类称为真类。NGB 公理集合论选择通过排除真类来避免 Russel 悖论。
== 一致性问题
前面讨论一阶逻辑的一致性时,采用了朴素集合论的语言。然而 ZF 系统本身就在定义集合,再使用朴素集合论似乎有些循环。例如,@model-cardinality 给出 ZF 应该有可枚举的模型,而 ZF 中可以证明存在不可枚举的模型,听起来也十分荒谬。
#proposition()[相对一致性][
$S^*$$S$ 的一个扩充,若 $S^*$ 是一致的,则 $S$ 是一致的
]
一阶逻辑具有绝对一致性,然而一阶逻辑的扩充,例如 ZF 系统,是否具有某种的一致性仍然是一个未解问题。
84 changes: 84 additions & 0 deletions 数理逻辑/作业/ml-5_2-hw.typ
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#import "../../template.typ": proof, note, corollary, lemma, theorem, definition, example, remark
#import "../../template.typ": *
#import "../main.typ": not1, True, False, infer
#import "../main.typ": *
#show: note.with(
title: "作业5_1",
author: "YHTQ",
date: datetime.today().display(),
logo: none,
withOutlined : false,
withTitle : false,
withHeadingNumbering: false
)
#set heading(numbering:
(..nums) =>
{
let nums1 = nums.pos()
nums1.insert(0, 12)
numbering("1.1.(a)", ..nums1)
}
)
= #empty
首先证明:
$
forall y (forall z (z < y -> calA(z)) -> calA(y)) tack calA(0)
$
#deduction()[
+ $not1 (z < x) :=$ 基本结论
+ $not1 (z < x) -> (z < x -> calA(z)) := tauto$
+ $z < x -> calA(z) := $ MP
+ $forall z (z < x -> calA(z)) := GEN$
+ $calA(x) := $ MP
]
再证明:
$
forall y (forall z (z < y -> calA(z)) -> calA(y)) tack calA(x)
$
#let basic = "基本结论"
$calB(x') := forall z, z <= x' -> calA(z)$,有:
#deduction[
+ $calB(0) -> (forall x_1 (calB(x_1) -> calB(s(x_1)))) -> calB(x) := $ N7
+ $calA(0) :=$ 前已证
+ $z <= 0 -> z = 0 := basic$
+ $z = 0 -> calA(0) := $ E8
+ $calB(0) := $ transitivity
+ $(forall z (z < s(x_1) -> calA(z))) -> calA(s(x_1)) := forall$ elim
+ $(forall z (z < s(x_1) -> calA(z))) <-> calB(x_1) := basic, $ 可证等价替换性
+ $calB(x_1) -> calA(s(x_1)) := $ 可证等价替换性
+ $calB(s(x_1)) <-> (forall z (z <= x_1 or z = s(x_1)) -> calA(z)) := $ 可证等价替换性
+ $forall z (z <= x_1 or z = s(x_1)) -> calA(z) <-> forall z (z <= x_1 -> calA(z)) and (z = s(x_1) -> calA(z)) := tauto, $替换
+ $forall z (z <= x_1 -> calA(z)) and (z = s(x_1) -> calA(z)) <-> forall z (z <= x_1 -> calA(z)) and forall z(z = s(x_1) -> calA(z)) := forall and$
+ $calB(s(x_1)) <-> calB(x_1) and forall z(z = s(x_1) -> calA(z)) := $ transitivity
+ $forall z(z = s(x_1) -> calA(z)) <-> forall z(z = s(x_1) -> calA(s(x_1))) := $ 可证等价替换性
+ $forall z(z = s(x_1) -> calA(s(x_1))) <-> (exists z (z = s(x_1))) -> calA(s(x_1))$
+ $(exists z (z = s(x_1))) := exists$ intro $s(x_1)$
+ $forall z(z = s(x_1) -> calA(s(x_1))) <-> calA(s(x_1)) := $ 可证等价替换性
+ $calB(s(x_1)) <-> calB(x_1) and calA(s(x_1))$
+ $(calB(x_1) -> calA(s(x_1))) -> (calB(x_1) -> (calB(x_1) and calA(s(x_1)))) := tauto$
+ $calB(x_1) -> (calB(x_1) and calA(s(x_1))) := MPb(8, 18)$
+ $calB(x_1) -> calB(s(x_1)) := $ 可证等价替换性
+ $forall x_1 (calB(x_1) -> calB(s(x_1))) := GEN$
+ $calB(x) := $ MP 5, 21, 1
+ $x <= x -> calA(x) := forall$ elim x
+ $x <= x := basic$
+ $calA(x) := $ MP
// + $(forall x_1 (calB(x_1) -> calB(s(x_1)))) -> calB(x) := $ MP
// + $(forall z' (z' < s(x_1) -> calA(s(x_1))) -> calA(s(x_1))) := forall$ elim
// + $x_1 = x -> not1 s(x_1) < x := basic$
// + $not1 s(x_1) < x -> calB(x_1) := fA$
// + $s(x_1) = x -> calB(s(x_1)) := $ transitivity
// + $s(x_1) > x -> not1 s(x_1) < x := basic$
// + $s(x_1) > x -> calB(s(x_1)) := $ transitivity
// + $s(x_1) < x -> x_1 < x := basic$
// + $x_1 < x -> calB(x_1) -> calA(x_1) := tauto$
// + $s(x_1) < x -> calB(x_1) -> calA(x_1) := $ transitivity
// + $s(x_1) < x -> calB(x_1) -> (s(x_1) < x -> calA(s(x_1)))$
// + $0 < y + 1 := $ 基本结论
// + $0 < x := $ E8, MP
// + $$
]
由于左侧都是闭式,演绎定理立刻给出原结论
= #empty
目前还没有发现 ZF 中存在矛盾,因此 ZF 中没有目前已知的矛盾。ZFC 公理系统提供了足够强的构造能力,绝大多数数学系统(例如算术系统)都可以构造于 ZFC 系统中。换言之,只要 ZFC 系统是一致的/有模型,则这些具体的数学系统也是一致的/有模型的,这就将不同数学分支所研究的数学系统的一致性问题全部转化到了 ZFC 系统的一致性问题上。

163 changes: 163 additions & 0 deletions 机器学习数学导引/code6/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm-project.org/#use-with-ide
.pdm.toml
.pdm-python
.pdm-build/

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/
*.ckpt

# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
1 change: 1 addition & 0 deletions 机器学习数学导引/code6/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# code6
Loading

0 comments on commit 1ec5a82

Please sign in to comment.