Java/深入理解 CAS

Java/深入理解 CAS

Java 中的synchronized是一种悲观锁,悲观锁始终假设会发生并发冲突,因此会阻止一切可能违反数据完整性的操作。而 CAS 是一种乐观锁 CAS 全称是 Compare and Swap。乐观锁假设不会发生并发冲突,因此只在提交的时候检查是否违反数据完整性,如果提交失败则会进行重试。

CAS 支持原子更新操作,适用于计数器,序列发生器等场景。CAS 操作失败时由开发者决定是继续尝试,还是执行别的操作。

阅读更多
如何写出一篇好的文章

如何写出一篇好的文章

写作是一种施展影响力最重要的载体。而写作作为一门武功,门派林立,在描述不同的题材时,用的方法也不同。在《刘润的 5 分钟商学院》中,提出了专栏写作能力的三大心法:价值感、结构感和对象感。我认为这是针对叙述性文章解释一个事物、阐述一个概念的最好方法。

价值感

首先,专栏文章可分为 3 类: WHAT(是什么),WHY(为什么),HOW(怎么做)。

  • 写 WHAT 类文章相对最容易,就是解释概念;
  • 写 WHY 类文章要难不少,需要联系动机:我为什么要理解这个概念;
  • 写 HOW 类文章相对最难,实际应用:到底应该怎么做,才能利用这个概念,并因此获益。

WHY,比 WHAT 有价值感;HOW,比 WHY 有价值感。写作之前,你要想清楚,你打算让你的读者,带着 WHAT 离开,还是带着 WHY 离开,还是带着 HOW 离开。你是不是真的打算付出数倍的努力,死磕自己,提供最难的 HOW 的价值。

结构感

一个不克制自己表达欲的人,写不好专栏。为什么?因为写作的内核,时关注对方怎么看,而不是自己怎么写。优秀的文章,是读者的盛宴,而不是表达欲的满足。愿意压制自己“痛快淋漓式的表达”。用结构感这把手术刀,把文字切割到让对方“醍醐灌顶式的理解”,才是好的写作者。而我学到的最好的写作结构,就是起承转合五步法

起承转合五步法

1. 场景导入

不要使用“刘备”、“奥巴马”开场,因为离你太远。好的开场应该是:最近工作越来越吃力,像退却,但孩子在读学费高昂的国际学校;你的衣服已经很便宜了,可客户就是说贵不肯买。

发生在你身边的事,最容易有导入感,这就是“场景导入”,为了请求你给我 30 秒,继续讲下去。

2. 打破认知

在这个场景下,应该怎么办?

这么办吗?不对;

那么办吗?也不对。

都不对,这就是“打破认知”,让读者产生强烈的好奇:哦?那到底怎样才是对的呢?你可能会再慷慨地给我 2 分钟,让我慢慢阐述。

3. 解释原因,核心逻辑

终于要讲核心逻辑了,但是,不能光讲道理,读者不爱听。要用一个极具说服力的大案例,带出逻辑。你可以讲二战的时候,盟军和德军的故事,最后提炼:这就是“幸存者偏差”。

读者会打破砂锅问到底,我们就要用不可辩驳的事实,翔实的数据材料,深刻洞察的见解,单反相机式的观点聚焦,写到读者叹服为止。

这两分钟,一定要寓教于乐,伺候读者,让你龙颜大悦:太享受了,而且太对了。再给你 2 分钟,你接着说。

4. 给出建议,举一反三

不知不觉,我们已经把 WHY 和 WHAT 讲完了,下面就是最难,但最有用的 HOW 了。我应该如何避免幸存者偏差呢?第一点、第二点、第三点;我应该如何利用幸存者偏差呢?第一点、第二点、第三点。读者,这时候就可以带着巨大的价值离开了......但是,还没完。

5. 回顾总结

你看了上面这么多内容,太辛苦了,我再用 30 秒,帮您回顾总结一下要点吧?然后,我努力把所有关键点,用一两句话讲清楚,重新强化概念,提炼金句,帮助你把概念,存放在大脑中最适合的地方。

做个挂钟是不够的。把挂钟的结构塞进怀表里,才是对读者的尊重。

这就是三千尺瀑布的逻辑势能,每一步都能引导读者的思想,能非常精准地揣摩读者如何思考。

提问,回答;再帮他问出来,接着再回答;再问出来,接着再回答......

结果就是,他读完文章后感觉畅快淋漓,直拍大腿:过瘾,真过瘾!

对象感

写作相对于直接对话,损失了现场感。为了还原现场感、传递情绪,写作者有个重要的心法:对象感。你想象自己不是在对着电脑,而是在与每一个具体的“你”,面对面交谈。

怎么做?

克制使用“大家”这个词,而是尽量使用“你”,营造对象感。比如:“我想请问你”、“你有没有遇到过这样的问题”。

除了用“你”之外,用词还需要适当口语化。比如“好了,今天我们就讲到这里”。这个“好了”,就是口语化表达。会让“你”觉得,我是在和你交谈,而不是对着镜子演讲。

这就是对象感。

用词精准

写出好文章的最后一点,就是游标卡尺式的用词拿捏,改、短、准。

把没有价值、没有知识含量的用词删掉。试试把长句改成短句,把长段落改成短段落,非常有助于读者能认知、理解、接受你的观点。

总结

写作,不是为了成为文学巨匠,而是为了准确传递信息,并获得巨大的接受度。

但作为一种商业沟通的工具,写作的门派非常多,今天分享的是写作的三大心法:价值感、结构感、对象感。用价值感死磕自己,用结构感切割文字,用对象感伺候读者。

用三千尺瀑布的逻辑是能征服读者;用单反相机式的观点聚焦写服读者;用游标卡尺式的用词拿捏服务读者。

PyTorch/[PyTorch 学习笔记] 7.3 使用 GPU 训练模型

PyTorch/[PyTorch 学习笔记] 7.3 使用 GPU 训练模型

本章代码:

这篇文章主要介绍了 GPU 的使用。

在数据运算时,两个数据进行运算,那么它们必须同时存放在同一个设备,要么同时是 CPU,要么同时是 GPU。而且数据和模型都要在同一个设备上。数据和模型可以使用to()方法从一个设备转移到另一个设备。而数据的to()方法还可以转换数据类型。

  • 从 CPU 到 GPU

    1
    2
    3
    device = torch.device("cuda")
    tensor = tensor.to(device)
    module.to(device)
阅读更多
PyTorch/[PyTorch 学习笔记] 7.2 模型 Finetune

PyTorch/[PyTorch 学习笔记] 7.2 模型 Finetune

本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson7/finetune_resnet18.py

这篇文章主要介绍了模型的 Finetune。

迁移学习:把在 source domain 任务上的学习到的模型应用到 target domain 的任务。

Finetune 就是一种迁移学习的方法。比如做人脸识别,可以把 ImageNet 看作 source domain,人脸数据集看作 target domain。通常来说 source domain 要比 target domain 大得多。可以利用 ImageNet 训练好的网络应用到人脸识别中。

对于一个模型,通常可以分为前面的 feature extractor (卷积层)和后面的 classifier,在 Finetune 时,通常不改变 feature extractor 的权值,也就是冻结卷积层;并且改变最后一个全连接层的输出来适应目标任务,训练后面 classifier 的权值,这就是 Finetune。

阅读更多
Java/Java的IO机制

Java/Java的IO机制

BIO、NIO、AIO 的区别

BIO

包括基于字节流的 InputStream 和 OutputStream,以及基于字符流的 Reader 和Writer。 ## NIO NonBlock-IO:构建多路复用的、同步非阻塞的 IO 操作 - Channels 其中 FileChannels 有 transferTo 和 transferFrom 两个方法,适合大文件的拷贝,避免了两次用户态和内核态的上下文切换,即"零拷贝",效率高

阅读更多
PyTorch/[PyTorch 学习笔记] 7.1 模型保存与加载

PyTorch/[PyTorch 学习笔记] 7.1 模型保存与加载

本章代码:

这篇文章主要介绍了序列化与反序列化,以及 PyTorch 中的模型保存于加载的两种方式,模型的断点续训练。

序列化与反序列化

模型在内存中是以对象的逻辑结构保存的,但是在硬盘中是以二进制流的方式保存的。

  • 序列化是指将内存中的数据以二进制序列的方式保存到硬盘中。PyTorch 的模型保存就是序列化。

  • 反序列化是指将硬盘中的二进制序列加载到内存中,得到模型的对象。PyTorch 的模型加载就是反序列化。

阅读更多
Java/Java 中的 synchronized 关键字

Java/Java 中的 synchronized 关键字

synchronized 关键字是为了解决线程安全问题的。我们先来了解下解决线程安全问题的主要诱因。线程安全问题的主要诱因有两点: - 存在共享数据(也称为临界资源) - 存在多条线程共同操作这些共享数据

要解决线程安全问题,只有一个办法:保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等待该线程处理完数据后再对共享数据进行操作。

阅读更多
PyTorch/[PyTorch 学习笔记] 6.2 Normalization

PyTorch/[PyTorch 学习笔记] 6.2 Normalization

本章代码:

这篇文章主要介绍了 Batch Normalization 的概念,以及 PyTorch 中的 1d/2d/3d Batch Normalization 实现。

Batch Normalization

称为批标准化。批是指一批数据,通常为 mini-batch;标准化是处理后的数据服从\(N(0,1)\)的正态分布。

批标准化的优点有如下:

  • 可以使用更大的学习率,加速模型收敛
  • 可以不用精心设计权值初始化
  • 可以不用 dropout 或者较小的 dropout
  • 可以不用 L2 或者较小的 weight decay
  • 可以不用 LRN (local response normalization)
阅读更多
Java/Java 中的强引用、软引用、弱引用、虚引用

Java/Java 中的强引用、软引用、弱引用、虚引用

  • 强引用(Strong Reference)
    • 最普遍的引用:Object obj = new Object();
    • 内存不够时,即使抛出 OOM 也不会回收具有强引用的对象
    • 通过将对象设置为 null,使其被回收
  • 软引用(Soft Reference)
    • 对象处理有用但非必须的状态
    • 只有当内存空间不足时,GC 会回收该引用的对象的内存
阅读更多
PyTorch/[PyTorch 学习笔记] 6.1 weight decay 和 dropout

PyTorch/[PyTorch 学习笔记] 6.1 weight decay 和 dropout

本章代码:

这篇文章主要介绍了正则化与偏差-方差分解,以及 PyTorch 中的 L2 正则项--weight decay

Regularization

Regularization 中文是正则化,可以理解为一种减少方差的策略。

在机器学习中,误差可以分解为:偏差,方差与噪声之和。即误差=偏差+方差+噪声

偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。

方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。

噪声则表达了在当前任务上学习任何算法所能达到的期望泛化误差的下界。

阅读更多