1,857 karma · joined May 8, 2015
rver017@aucklanduni.ac.nz
Those slides are my introduction to Fortress. Sounds nice, sorry to hear it's discontinued. I'm struck by how very similar to Julia it is (which is officially inspired by Fortress), for example the focus on performance and maths, zero-cost abstractions, type specialisation, very similar syntax, ASCII<->Unicode equivalence, encouragement of unicode identifiers and operators, and some (small) amount of eliding '*' for multiplication. (You can write "2(a + 1)a^2" but not "(a+1)(a+2)" because the latter is a function call. Whitespace between multiplicands not allowed.)
It seems it would be easy to write a package to display Julia code as HTML or Latex, although I didn't find one. There's already a library to print expressions as Latex, and of course in a Jupyter notebook results are displayed in HTML.
But you may have conflated 'testability' and 'tested'. Can I know there is a cow in the field if I don't check? Seeing it was already evidence, testing just collects more evidence, so how can that matter? Should we set a certainty threshold on knowledge? Could be reasonable.
Maybe prediction-making is too strong to be necessary for 'knowing', if we allow knowing some fact in a domain of knowledge of which you're otherwise clueless. Although very reasonable to not call this knowledge. Suppose I learn of an mathematical theorem in a field that's so unfamiliar that I can't collect evidence to independently gain confidence in it.
'Formal' which here means inputs to a proof verifier/proof assistant, and I think most people would accept it as a given that by the extremely data-hungry standards of LLMs there is a severe lack of such data, and that this is a severe hindrance to getting an LLM to generalise. The question is how they might scale with more training data.
And then Bose-Einstein condensates; a thought-experiment consequence of Bose-Einstein statistics.
Radio waves etc., from formulating Maxwell's equations.
And when you have a (two-layer) RBM you can integrate out the hidden variables and get a MRF without them (as I first described), or vice-versa. Which is more useful depends.
Or if you're more interested in textures, RBMs are used for texture and image modelling (e.g. [1]), and higher order statistics are far more interesting. In virtually all papers they take the form of the responses of linear filters (like that 3x3 filter in OP, often wavelets for natural images). But you can use completely different statistics. I found that long-range local binary patterns (LBPs), used for texture recognition, are good for texture generation too.
I've switched away from textures, but energy-based models are harder to escape. A surprising intersection of old and new topics at [2].
[1] R Liao, S Kornblith, M Ren, D Fleet & G Hinton, 2022, "Gaussian-Bernoulli RBMs Without Tears" https://arxiv.org/pdf/2210.10318
[2] C Zhang, B Jia, Y Zhu & S-C Zhu, 2024, "Human-level few-shot concept induction through minimax entropy learning" https://www.science.org/doi/10.1126/sciadv.adg2488
The statistics are 9th-order (of 3x3 blocks of pixels) but of a simple form which are hardly more expressive than 2nd-order nearest neighbour statistics (in terms of the different textures that they can reproduce) which are well known. In the approximate case where you only care about the average value of each pixel I think it would collapse to 2nd-order. Texture synthesis with MRFs with local statistics is discretized (in space) Turing reaction-diffusion. I did my PhD on this topic.
Probably the most influential early paper on this kind of simple texture model, where you will see similar patterns, is:
Cross & Jain, 1983, PAMI, Markov Random Field Texture Models
But I imagine it's still a great resource. Haven't played with it.
I was reading through the source code for both (and the Interlisp manual, but mostly Eurisko) earlier this year and found it quite inspiring. Some of the most meta(-meta-heuristic search) code ever written! Now I'm working on a similar project and am looking for parts of AM's and Eurisko's algorithms which I can incorporate! I'll write something up if I have any success.
Eurisko is far more abstract than AM, but the data structures (structures with named 'slots' (members)) it uses makes the code vastly more readable (AM is pretty damn unreadable despite plenty of comments). Lenat himself said the better representations are what made Eurisko possible, unsurprisingly. If you do want to understand the implementation of AM in incredible detail you can read Lenat's PhD thesis. No detailed documentation of Eurisko exists. Also, both programs contain lots of code to print out what the system is currently doing, which is incredibly helpful for deciphering the code.
You're completely incorrect to say RBMs were of theoretical interest only. They have had plenty of practical use in computer vision/image modelling up to at least a few years ago (I haven't followed them since). Remember the first generative models of human faces?
Edit: Wow, Hinton is still pushing forward the state of the art on RBMs for image modelling, and I am impressed with how much they've improved in the last ~5 years. Nowhere near diffusion models, sure, but "reasonably good". [2]
[1] G.E. Hinton and R. Salakhutdinov, 2006, Science. "Reducing the Dimensionality of Data with Neural Networks"
[2] "Gaussian-Bernoulli RBMs Without Tears" https://arxiv.org/pdf/2210.10318
I definitely agree that AGI isn't just a matter of scaling transformers, and also as you say that they "may not be the best" for such tasks. (Vanilla transformers are extremely inefficient.) But the really important point is that transformers can do things such as abstract, reason, form world models and theories of minds, etc, to a significant degree (a much greater degree than virtually anyone would have predicted 5-10 years ago), all learnt automatically. It shows these problems are actually tractable for connectionist machine learning, without a paradigm shift as you and many others allege. That is the part I disagree with. But more breakthroughs needed.
So, I agree instead with meowface, and think it could even have been a 5+ year delay rather than 2 or 3. If you look at breakthroughs rather than incremental improvements, 5 years is not a long timescale. (And if OpenAI hadn't have made their breakthroughs, production of the highest-end GPUs/TPUs would be nowhere near where it is today.)
(I'm not attempting to justify OpenAI's structure or behaviour, just want to comment on one point.)
I'm very confused by your attitude towards that comment. Do you think that Mozilla's non-profit/for-profit split organisation was a bad idea?
Oh really :)
I'd like to ask how applications should change their memory allocation or usage patterns to maximise the benefit of THP. Do memory allocators (glibc mainly) need config tweaking to coalesce tiny mallocs into 2MB+ mmaps, will they just always do that automatically, do you need to use a custom pool allocator so you're doing large allocations, or are you never going to get the full benefit of huge tables without madvise/libhugetlbfs? And does this apply to Mac/Windows/*BSD at all?
[Edit: ouch, I see /sys/kernel/mm/transparent_hugepage/enabled is default set to 'madvise' on my system (Slackware) and as a result doing nearly nothing. But I saw it enabled in the past. Well that answers a lot of my questions: got to use madvise/libhugetlbfs.]
I read you also need to ensure ELF segments are properly aligned to get transparent huge pages for code/data.
Another question. From your link [2]:
> An application may mmap a large region but only touch 1 byte of it, in that case a 2M page might be allocated instead of a 4k page for no good.
Do the heuristics used by Linux THP (khugepaged) really allow completely ignoring whether pages have actually been page-faulted in or even initialised? Is a possibility unlikely to happen in practice?
So I'm really interested in the "filling up" part, if you have anything to say about it.
The undecidability of Turing machines in general doesn't say you can't reason about any programs, as you seem to claim, it says there exists programs which have unverifiable behaviour.
(Although the proof provides unnatural examples, in practice simple recursive mathematical functions such as the Collatz conjecture will probably always be beyond automated analysis.)
Of course software that was not written with verification in mind can be verified correct, provided it doesn't contains things such as an interpreter or complex conditional recursion. There are static analysis tools for analysing programs in languages such as C++ which make use of ATPs (automated theorem provers). For example, most of zlib has been proven correct using Coq. Yes, verification of the entirety of complex programs is in general impossible, but parts of them can still be verified. It's the most common use of ATPs, and an active area of research!
> we show that we can eliminate all multiplications in the entire training process, including operations in the forward pass, backward pass and optimizer update, demonstrating the first successful training of modern neural network architectures in a fully multiplication-free fashion.
This reaches demoscene levels of crazy/impressive!
https://openai.com/index/better-language-models/ See "Policy Implications" and down.
I used to live by rails with a small incline, and the diesel locomotives made a loud low noise accelerating uphill from a station, while downhill the trains moved far faster and the engines were quite insignificant compared to noises due to speed: mainly the wheel noise and going over the expansion joints.
Thank you for fighting the good fight.
This is why I love OpenReview, I can spot and ignore nonsensical reviewer criticisms and ratings and look for the insightful comments and rebuttals. Many reviewers do put in a lot of very valuable work reading and critiquing most of which would go to waste if not made public.
So if you wished you could implement a transformer by recomputing everything on every token. That would be incredibly inefficient. However, if you're continuing a conversation with an LLM you likely would recompute all the state for all tokens on each new user input, because the alternative is to store all that state in memory until the user gets back to you again a minute later. If you have too many simultaneous users you won't have enough VRAM for that. (In some cases moving it out of VRAM temporarily might be practical.)