Sanity Checks for Sanity Checks for Sparse Autoencoders
This post will probably not be very informative to readers who don't know what an SAE (Sparse Autoencoder) is.
An interpretability researcher once told me, "SAEs can never fail, they can only be failed." But recently, SAEs have been suffering failure after failure, and as a result, the field has grown increasingly pessimistic about SAE work. Korznikov et al.'s Sanity Checks for Sparse Autoencoders: Do SAEs Beat Random Baselines? purports to be an example of such failures.
However, I have some disagreements with its methodology. The paper presents a synthetic setup with known ground truth features, and claims that SAEs fail to recover features in the "simplest toy setting with fully aligned hyperparameters." In this post, I argue that their setting is not forgiving to SAEs, as the authors imply, but is instead actively hostile in ways that real settings are not.
Introduction
Sanity Checks for Sparse Autoencoders: Do SAEs Beat Random Baselines? asks two important questions:
- Can SAEs actually recover real features? Hypothetically, if we knew what the "true" features of the data were, would an SAE be able to identify them?
- Do trained SAEs actually do better than completely random SAEs?
This post will be focused on their answer to the first question.
The authors train an SAE on a synthetic toy model, with known ground-truth features, and according to their abstract, SAEs only recover 9% of true features. On the face of it, this seems pretty damning!
Now, earlier toy model experiments did show that SAEs could recover ground truth features, but the authors argue this is because they used a small expansion factor, where there were only twice as many "true" features as there were model dimensions, and that this is unrealistic. Their setup uses an expansion factor of 32, which matches real-world use cases much more closely.
So, how does their setup work?
They don't actually construct a synthetic neural network; instead, they create synthetic activations directly. First, they create their feature vectors, by sampling 3200 vectors from the unit sphere in 100-dimensional space. To create an activation, they just select about 20 feature vectors at random, scale each active feature by a magnitude drawn from LogNormal(0, 0.25),[1] and sum the scaled vectors.
They test two different regimes, one where each feature is equally likely to be active, and another where feature activation frequency has a long tail, so some features fire more often than others. (We'll focus on the constant regime for the most part)
They match their SAE to the setup. There are about 20 expected active features, so they target L0 = 20. There are 3200 true features, so they create 3200 SAE latents. Can the SAE, when given every possible advantage, recover the true features?

These results are, again, pretty damning! They claim that the SAE achieves high reconstruction accuracy while only recovering 3/3200 true features—personally, I disagree that 0.67 explained variance is "high reconstruction accuracy".[2] However, the SAE clearly only does slightly better than random guesswork at recovering the true features.
Now, one obvious objection is that L0/d_model here is 0.2, which is unusually dense. I'd expect there to be a lot of interference here, and in the real world L0/d_model is probably going to be closer to 0.05. Also, 100 dimensions is just not a lot, and maybe you can't really get blessing of dimensionality from it like you would in real models.
A less obvious objection is that if you scroll all the way down to Appendix B, they describe some other SAE architectures they used for this task, like TopK and Matryoshka-on-BatchTopK.

In contrast to BatchTopK, TopK recovers 99.9% of features.[3]
So, I did what anyone would do, and started replicating the paper. They didn't actually include all the hyperparameters they used,[4] so I made reasonable assumptions.
I was able to replicate this result! TopK recovered 99.6% of features,[5] and the other architectures failed miserably.[6]
Why does BatchTopK fail?
This is kind of strange, if you think about it. TopK and BatchTopK are the same architecture, with the only difference being the selection rule.[7] Such a dramatic gap is really weird.
Peeking a bit closer at my training run, in every batch, most latents never fired. That means a small group of monopolist latents were dominating every time. By step 5,000, the same ~6% of latents took over, and they remained in charge for the remaining 295,000 steps. In comparison, with TopK, after the first 20k steps, >99% of latents activated on every batch.
This is the standard dead latents problem: There's no gradient on latents that aren't selected, so once they fall behind in performance it's hard for them to improve. A small group of generalist latents dominate before specialists have the chance to form. The standard fix, of course, is an auxiliary loss, AuxK. But even with AuxK, the dead latent fraction barely budges. I tried sweep
Google's First Data Center Satellite Is Online and Writing Poetry
Read more of this story at Slashdot.
Supersonic Airliner In Doubt As Company Shifts to Powering AI Data Centers
Read more of this story at Slashdot.
Two US Senators Raise Privacy Concerns About Meta's 'Pervert Glasses'
Read more of this story at Slashdot.
Google's AI Overviews Lowered Reddit's Traffic. Its Stock Dropped 29%
Read more of this story at Slashdot.
Flock Reinstalled Its Cameras After Another City Canceled Its Contract
Read more of this story at Slashdot.
Dozens of Unexplained Drones Have Buzzed America's Nuclear Plants Since 2024
Read more of this story at Slashdot.
NASA Seeks Proposals for Reboosting the Hubble Space Telescope
Read more of this story at Slashdot.
French Lawmakers Back Per-Gigabyte Internet Traffic Tax
Read more of this story at Slashdot.
Recycling ANSI Art: Tracing the Origins of BBS Logon Screens
Read more of this story at Slashdot.
Computer Simulations Suggest Building Blocks of Life Didn't Arrive on Prehistoric Comets
Read more of this story at Slashdot.
Binance Replenishes 90% of Stolen $6.3B, Pledges They'll Cover It All, Reopen Sunday
Read more of this story at Slashdot.
Xbox Manager: AI Already Being Used In Xbox Game Development - And Throughout the Game Industry
Read more of this story at Slashdot.
蔚来的“三个聚焦”:为规模幻觉买单之后
(本文作者为 Tech商业,钛媒体经授权发布)
文 | Tech商业
进入2026年第四季度,蔚来的战略退守已经毫无遮掩。
在此前内部全员讲话中,蔚来创始人李斌提出了一个核心基调:未来三年,蔚来不搞大扩张,核心任务是“聚焦主业,聚焦高端,聚焦核心市场”。随后,在10月21日的世界智能网联汽车大会上,吉利控股董事长李书福被问及与蔚来的换电合作时,用了一句极其务实且冷酷的话来定调:“我觉得不能搞重复建设。吉利搞一套,蔚来搞一套,重复建设,没有必要,因此就合并了。”
两位车企掌门人的隔空表态,叠加刚刚披露的9月及三季度成绩单,揭开了蔚来当下最真实的处境。过去几年,蔚来试图用多品牌(蔚来、乐道、萤火虫)、多价格带、以及一张庞大的换电网络,去讲一个“豪华纯电生态”的规模故事。但现在的蔚来,正在被迫把摊子收回来。
放弃规模幻想,不再试图讨好所有人,成了蔚来在这个冬天最理性的选择。而刚结束的三季度数据,为这场战略收缩提供了一个极其刺眼的注脚:9月份,蔚来主品牌交付21318台,同比增长55.3%;萤火虫交付7327台;而被寄予厚望、承担走量任务的乐道品牌,仅交付8763台,同比暴跌42.52%。
乐道的失速:走量引擎熄火与内部的左右互搏
乐道曾经是蔚来规模叙事的绝对核心。李斌为2026年定下的近50万辆销量目标中,乐道需要承担一半以上的份额。乐道L60切入的20万级纯电SUV市场,被视为用蔚来换电体系降维打击燃油车和特斯拉的利器。
但现实极其残酷。这个价格带在2026年已经变成了全行业竞争最惨烈的“绞肉机”。进入四季度,小米SU7和YU7以疯狂的流量继续收割市场,小鹏MONA和G系列用极致性价比死死咬住底盘,极氪和理想的新车排着队上市。面对这些对手,乐道L60在产品定义上显得中规中矩,没能拿出碾压性的优势。
更致命的伤害来自蔚来内部。为了在年底冲刺主品牌的销量,蔚来在近期进行了一系列价格和权益调整,主品牌部分车型的价格门槛实质上已经下探到了30万以内。这直接导致了“左右互搏”:大量原本预算20多万、打算买乐道的用户,稍微踮踮脚,直接去提了带蔚来Logo的主品牌车型。
乐道L90的轨迹更典型:2026年5月开启交付后,首月与L80合计交付破万,一度成为纯电大型SUV市场的热门车型;但到了今年下半年,月销只能在2000到4000台之间徘徊。当品牌势能往下走时,产品力再强也扛不住。
乐道的失速,意味着蔚来“用中低端品牌走量、摊薄高端品牌研发与换电成本”的路径彻底破产。李斌的“聚焦高端”,本质上是对这个结果的无奈确认:既然在20万级市场打不过那帮杀红了眼的对手,不如退回自己拥有35%份额的30万以上高端纯电市场,至少那里的利润率和基盘还能看。
换电的算盘:从“独自修路”到“拉人垫背”
乐道走量不畅,直接动摇了蔚来换电网络的规模基础。换电是一门典型的规模生意:单站日均换电需要达到60到70次才能实现盈亏平衡。而蔚来目前的单站日均换电仅约24次,全国仅约两成站点达到了盈亏平衡线。
蔚来在充换电领域累计投入超过200亿元,每年还要付出高昂的运维成本。如果蔚来的车卖不到足够的量,这几千座换电站就会变成吞噬现金流的无底洞。
于是,蔚来不得不向现实低头,将换电资产“资本化”。9月底,吉利以易易互联100%股权加6.4亿元现金入股蔚来能源,换取了30%的股份,蔚来能源投后估值约160亿元。易易互联的底牌,是那10万辆主要在跑网约车和出租车的营运车辆。营运车对补能时间极其敏感,是换电模式最理想的客源。
李书福说“重复建设没有必要”,这绝不仅仅是给蔚来捧场,而是吉利算过账:与其自己花几十亿去铺设换电网络,不如直接入股蔚来现成的盘子。
但这笔交易也暴露出蔚来换电模式的脆弱。联盟成立了三年,长安、吉利、奇瑞、江淮等车企都签了协议,但直到今天,路上几乎没有跑着这些品牌的换电乘用车。换电业务,依然是蔚来一个人在扛最重的重资产。引入吉利,只是让蔚来从“独自放血”变成了“分摊失血”。吉利的持股比例还与蔚来能源的经营业绩挂钩,在20%至34%之间浮动:经营不及预期时最低可降至20%,若达标则可追加6.4亿元将持股提至34%。这意味着如果换电规模上不去,吉利甚至可能下调持股比例。换电网络的核心风险,依然死死压在蔚来的资产负债表上。
研发收缩:省下来的钱,与可能省掉的未来
“三个聚焦”的另一个直接后果,体现在研发端。
2026年上半年,蔚来研发费用同比下降34.9%,绝对值约40.3亿元。同期小鹏研发投入58.2亿元,理想55亿元。蔚来是“蔚小理”三家之中,唯一研发投入同比走低的公司。
李斌对此的回应是:蔚来只做纯电,没有增程、插混等其他技术路线,研发资源可以跨品牌复用,效率更高。这个解释在逻辑上成立。蔚来的确可以把主品牌的高端智驾和座舱能力复用到乐道和萤火虫上。
但问题在于,智能驾驶和AI是典型的“不进则退”赛道。进入四季度,对手在持续加大投入。当小鹏和理想每年在智驾上砸下数十亿研发费用时,蔚来用“聚焦”省下来的每一块钱,都在拉长它与第一梯队之间的技术距离。这个距离在2026年可能还不明显,但在2028年的产品周期里,会不会变成一个难以弥补的代差,目前没有人能给出确定的答案。
与此同时,蔚来二季度的盈利质量也需要放在成本结构里审视。汽车毛利率18.5%,同比提升8.2个百分点;经调整净利润2610万元,连续第三个季度经调整盈利。但按照会计准则,二季度仍然净亏损5.28亿元。经调整盈利和净亏损之间的差额,包含了股权激励等非现金项目,但净亏损本身说明,蔚来的经营现金流尚未稳定到可以完全覆盖所有刚性支出的程度。
盈利的改善,主要来自高毛利车型(ES8、ES9)的占比提升和费用端的压缩,而非全系产品盈利能力的系统性抬升。当高毛利车型的销量触及细分市场的容量上限之后,毛利率继续向上修复的空间就会收窄。管理层对下半年汽车毛利率的指引是“维持在约18%”,措辞是“稳住”,不是“提升”。
制造端的效率:救不了规模的病
为了弥补规模上的不足,蔚来在制造端大力推进工业AI。10月底,蔚来先进制造工厂获评了“国家卓越级智能工厂”。据蔚来官方披露的数据,自研的“天探”系统3分钟就能完成千余项整车功能自检;“天瞳”质量检测岛84秒下线一台车,缺陷识别率99.7%。
这些数据说明了蔚来在制造和工业AI上的投入确实有了成果。它直接带来了制造成本的边际下降和质量的稳定。
但在汽车这个极度依赖规模效应的行业里,效率提升救不了销量不足。工厂的自动化程度再高、AI检测再快,如果没有足够的订单来填满产能,那所有的先进设备都会变成财务报表上沉重的折旧费用。二季度18.5%的汽车毛利率,很大程度上是靠高毛利的ES8等车型占比提升拉起来的,而不是因为制造端的AI让单车成本降了多少。
结语:窄门里的生存游戏
蔚来现在的目标,是实现全年Non-GAAP盈利。从二季度经调整净利润2610万元、连续三个季度经调整盈利的表现来看,蔚来确实学会了“抠成本”。567亿元的现金储备和正向的经营现金流,也为收缩战略提供了足够的缓冲。

但这只是止血。对于一家车企来说,长期估值的锚,永远是“能卖多少车”以及“每辆车能赚多少钱”。
“三个聚焦”是一个极其务实的战略,但它把蔚来逼进了一个容量有限的窄门——30万以上的高端纯电市场。在这个细分市场里,蔚来确实没有对手,但整个盘子也就那么大。当主品牌触及天花板、乐道无法走量、换电网络还在等别人来造车的时候,蔚来接下来的增长故事,变得越来越难讲。
李斌说明年会有一款重量级新车。在规模幻觉破灭之后,蔚来必须靠这款车,在这扇窄门里砸出一点新的增量空间。资本市场的耐心是有限的,留给蔚来证明这套收缩战略能行的窗口期,真的不长了。
更多精彩内容,关注钛媒体微信号(ID:taimeiti),或者下载钛媒体App
Waymo Partners With Toyota For New Robotaxi. It Could Have Been Tesla
Adding RAG: store your own judgment and grow your AI
This is part 1 of the series "Adopting RAG — Grow your AI on your own accumulated judgment."
Series contents
- Adding RAG: store your own judgment and grow your AI (this article)
- What RAG should search, and what an index should answer (coming soon)
My Claude Code setup loaded a 32KB index of its own notes at the start of every session, and it still kept making the mistakes those notes were written to prevent. "Take the screenshots for the English version in the English UI." "This article is too long." Each correction was saved as a memory note the first time I made it. One of those notes still quotes me asking how many times I have to say it.
The notes were there. What was missing was the moment. When the situation came up mid-task, the AI did not go back and look. That is not specific to Claude Code: any AI coding agent with saved notes, Codex included, has to decide to search them, and that decision is the step that gets skipped.
So I added RAG. RAG (retrieval-augmented generation) means that before the AI answers, something searches your own records and hands it the closest ones. Mine runs on every message I send: it searches my past notes and conversations by meaning and hands the closest few to the AI before it answers. We call it memory recall. It is part of ELN workflow, the in-house plugin suite we use with Claude Code. It relies on a Claude Code hook (a script Claude Code runs automatically at fixed moments, here every time you send a message), so today it runs on Claude Code only. The idea would work for any agent.
Nothing gets retrained. What changes is what the AI is handed. Every decision and correction I write down becomes something it can be shown the next time the situation comes up, so the more of my own judgment I store, the more the AI has to work with. That is what I mean by growing the AI with RAG.
An earlier article covered a related hook that hands the AI a list of our architecture decisions once, at session start (The real reason AI ignores existing decisions). Resending the same list on every message was wasteful, so that hook moved to session start. This one works per message: what it hands over changes with what you just said, it hands over nothing or a short list when the match is weak, and it never exceeds 2,048 bytes.
The short version
- Every message triggers a RAG search. It looks through the current project's memory notes, the titles of past conversations in the same project, and our shared engineering rules, and hands the closest matches to the AI before it answers.
-
Setting it up takes five steps. ELN workflow is in-house and not published, but every part it uses is public. The details, and a prompt you can hand to Claude Code as is, are in "Setting it up yourself" near the end.
- Write each correction or decision down as its own memory note, one note per file.
- Turn the notes into embeddings with bge-m3 and store them in a local index.
- Keep a search process running with the model loaded, embed each message with the same model, and rank the index by closeness.
- Query it from the Claude Code hook that runs on every message (UserPromptSubmit), and hand the headlines it returns to the AI.
- Decide how much to hand over by how far the top hit stands out from the rest.
- Stored judgment keeps paying off. A correction written down once becomes a candidate whenever a related message comes in, and is handed over when it is close enough. The model stays the same; the records it gets keep growing.
- It matches meaning, not words. A question with no words in common with the note still finds it. Because the model is multilingual, an English question even finds a note written in Japanese.
- It hands over headlines, not documents. At most five items and 2,048 bytes per message. Conversations go in as date and title only, never their content. The block is labeled as reference, not instructions.
- It injects nothing or only a short list when the match is weak. Similarity scores alone could not tell related messages from unrelated ones, so it looks at how far the top hit stands out from the rest, and injects nothing, a little, or a bit more.
- The search runs on the Mac. The embedding model (which turns text into numbers that can be compared by meaning), the index and the search process all live locally. The search sends nothing to a paid embedding API, and it costs nothing.
- It never holds up the conversation. If the search does not answer within 300 ms, the message goes through without it. Sixty repeat queries had a median of 69 ms and a worst case of 228 ms.
The screens below are real output from the live index on my Mac. The tool's own injection text is in Japanese only, so for this version I asked English questions and used jq (a command-line JSON filter) to print just the fields that matter. The command lines drop the script's install path, and the home folder in the output is shown as ~/.
An English question, a Japanese note
Here is the idea in one screen. I ask, in English, when the firm was founded. Searching the notes folder for "firm" or "founded" as whole words finds nothing. Searching by meaning puts the note about my name and company first, well ahead of the next one. That note records the founding year in Japanese, as 創業 2000年 ("founded in 2000").
Neither word from the question appears anywhere in that note. The note does contain some English, such as the company name and the file name, but the part about the founding year is written only in Japanese. A text search can only find the exact characters. The search here turns both the question and every note into embeddings (lists of numbers arranged so that texts with similar meaning end up close together) and compares those. The model is bge-m3, published by BAAI, which handles many languages, including English and Japanese, in the same space.
Long notes are split into 700-character pieces, and a note scores by its best piece, so that a detail further down than the first few lines still has a chance to be found.
Scores alone could not separate related from unrelated
Handing notes to the AI on every message is only useful if it holds back when nothing is relevant. Otherwise the context fills with noise. This was the part that surprised me.
In testing, the highest-scoring unrelated question scored 0.597. The median question that did have a correct note scored 0.589. Any cutoff on the score would either inject notes into unrelated messages or miss real ones.
What did separate them was th
Proton CEO Is In 'Full AI Psychosis'
Read more of this story at Slashdot.
First Wired XR Glasses Powered By Android XR
Read more of this story at Slashdot.
The Tragedy of Losing Your Wikipedia Page
Read more of this story at Slashdot.
Binance Suffers Biggest Crypto Hack In History With $6.3 Billion Affected [UPDATE]
Read more of this story at Slashdot.