RWKV-原理笔记-一-
RWKV 原理笔记(一)
[双字] 在{Transformer}时代, {RWKV}是RNN的[文艺复兴]--论文详解 - P1 - 编程语言观察 - BV11N411C76z
Hello today we're going to look at RWKV, which in its own words is reinventing RNN for the Transformer era。
This is a very interesting project and very interesting model architecture because it has some properties of transformers。
notably it's a model architecture that's very scalable in terms of training so you can stack it really deep and you can still train it and also you can parallelize training。
At the same time, it avoids the quadratic memory bottleneck that transformers have by essentially being an RN。
It's kind of a recurrent neural network in the sense that during inference。
you can compute the output step by step and always have a constant memory because everything is put into a hidden state。
We're going to look at how these two things come together and what the tradeoffs are between the two。
The project is also very interesting because it's been largely developed by one person or by just very few people who have worked on this and then compare this to entire corporations that are pouring their human resources into transformers and still the results are that this model in some cases。
not in all cases, but in some cases can be very comparable in terms of performance with transformers with really big transformers and as I said。
Is scalable, which so far RnNs have been lacking。We'll go over the paper。
We'll go over the architecture and see what's actually happening right here。
I have some of my own thoughts and you know, just opinions on this。 And I hope you're with me。
But first, let's。
Let me show you this。 fully connected is a conference。 It's by weights and biases。
It's a one day event, and it has pretty cool speakers。
So not only the cofounders of weights and biases themselves。
but the cofounder of Langcha is there The cofounder of Cagel I there。
Richard Soer from U do co is there Chiyian is there of Clapot there's so many people right here and so many cool speakers and as I said。
if you are in around the San Francisco area go give that event a visit if you want。
I'm going use put a link and a promo code into the description of this video that will make the tickets cheaper。
So the tickets will be 49 buck instead of what you see right here。
So that's going to be on June the 7。 don't forget that June the 7 in San Francisco。
It's an inperson event has a max capacity。 So grab it now。😊。
That's it。 Thanks to Bs and biases for also giving me this opportunity and also giving this to you。
It's very cool。So。RWKV, it stands for。Let me not screw this up。 Receptive receptance, Receptance。
R is for receptance。 W is for weight。 key K is for key, and V is for value。
These describe the different elements of the model architecture and will go through that will go through it。
So what are we dealing with。 We're dealing with a model that you can use for lots of things。
but we're mainly dealing with a model that in the instance it is outlined here is for language modeling。
by language modelling, we simply mean we have a piece of text, yada, yada yada, yada。
and what we want the model to predict is the next set, the next tokens or the next word in the text。
So from here, predict this thing and from here predict this thing and so on。
Transformers are usually used in this manner。 notably I would stick the entire prefix here into a big transformer and the transformer would spit out the next step。
it will do that in a form that we call causal attention。
which essentially means that every piece in the text right here。
So every token can attend to all the other tokens that are before it。
So all the other tokens that come in front of it would have be would be inputs to that token using attention that results in a quadratic in a quadratic requirement of compute and memory Now if you can see there if every token attends to its back。
it's like T times t minus-1 or something like this。Interactions that need to be considered。
so t squared in expectation。And。No, yes, maybe。Yeah, that makes about sense。
So transformers naturally have a limit because if you add one token。
then you always add a memory requirement of of T。 And so very quickly that scales to be out of proportion。
so their power is traded off by the fact that they can only consider a limited set of tokens at a time。
Recurrent neural networks trade this off。 recurrent neural networks if they have to do something like this。
if they have to have an input and then predict the next thing。
what they'll do is they'll just start here。Then they'll put something into a hidden state like a little memory。
I'm going to represent that as a box。 People have forgotten how R and Ns work。 I figured。
Like a few years ago, I could have talked about RnNs。
and every one of you would have known what I've talking about。
And then transformers are kind of the new thing。 And now it's more like I have to say。
I don't even have to mention stuff is a transformer But I do have to conversely explain RnN。
So it would put whatever it learns into a memory like this hidden box。
this box right here is the memory。 Then from that, it would consume the memory。
and it would consume this thing and it would build a new memory。
and then it would consume that memory and it would consume the next input。
it would build a new memory。 So it does this step by step。 and it can always。
you can drop the old memory。 So you can forget about the old memory because all you need pun intended to go forward from here on out is that current memory。
So you do step by step。 and you always save stuff into the memory into the hidden state or whatever you want to call it。
So RnNs have this really great property that they only require a constant memory in order to do inference。
😊,However, the individual, the individual inference step, for example, when we are here。
we have that memory, we predict the next the next token from it。
so we predict the next this thing right here。We can only consider the memory and the previous token。
That's all We cannot explicitly consider any token that is in the way back because everything goes through that hidden state。
And that bottleneck has usually been one of the downfalls for RNNs。
There is a problem of vanishing gradients。 There are a couple of other problems that you can't just compress information into that one hidden state plus RNNs have been notoriously hard to train because the inference always requires this step by step thing。
which means you have to do back propagation through time which is part of the vanishing gradient problem but also means that you can't parallelize the training in a transformer I can input a tokenop a token sequence of 50 tokens。
and that gives me 50 training examples which I can train all at the same time because of the causal attention mask。
In an RNN, if I have a sequence of 50 tokens, I can still only train one token loss at a time because I can't infer everything at the same time。
Our WKV is going to strike a trade off in the middle of those two things。 And in a sense。
so people ask, or I asked, is this a transformer more, is it an R and N more。
and I've come to the conclusion。It's a convenet。 and I'm going to I'm going to explain my reasoning。
and they they also refer to that, by the way。s it's not like I found out something great right here。
but in the most basic sense。You can think of this thing as a convolutional network across a one dimensional sequence of tokens。
That's that's going to be my statement and we'll go through it。
So they give a bit of an introduction right here on what it。
What this means and what I essentially just said, transformers scale quadraically with sequence length。
RNNs exhibit linear scaling, which is very beneficial, very advantageous。
The RWKV model combines the efficient, parallelizable training of transformers with the efficient inference of RNNs。
So it's like almost two modes between which you can switch around。
They say they have a linear attention mechanism and as I said。
they formulate the model either as a transformer or as an RN。
that linear attention mechanism is something that we're going to focus on in just a bit because。
It's not, it's not their fault because people have been doing it before them。
but I think it really stretches the word attention and what it means。
I think it stretches that to like a point where I don't agree anymore more calling it attention。
but again, they are not the first people。Kind of doing that。
so I'm not going to hold them to account right here。
They say this is the first nontransformer architecture that to be scaled to tens of billions of parameters。
So one of the properties of this thing is really you can scale it。
you can scale it and you can train it in parallel which also means you can pump a lot of data into it。
and that's very advantageous And there is a lot to be said here about maybe maybe it's not that much the architecture we're dealing with。
but more you know good models are simply models with architectures that are scalable。
So it's not maybe that's a hypothesis like how much of the performance of something like G4 is due to the fact that it is a transformer and how much is due to the fact just that is a scalable architecture you can pump a lot of data into We don't know。
Yet too well how those things exactly trade off。 But there is good argument to be made that, hey。
if you can find some other architecture, just just scales really well, then you know。
you might as well reach the same performance。This is a complexity。
a asympttic complexity table on the different ways of doing attention mechanisms。
so the transformer is that classic mechanism as we said it needs quadratic time in t big T is the sequence length of the sequence we're processing and then in terms of space it needs a little bit more。
but the leading term is also this t squared right here。
the D is the dimension I believe of the embeddings of the hidden spaces which is usually a constant factor across all of these things。
There there are various tradeoffs like a reformer and so on, performer, a lot of these。
they do approximations to the original transformer attention mechanism。
and it's also notable to say that RWKV is not an approximate attention or anything like this。
It doesn't try to approximate the original attention。
it replaces it with a different mechanism of considering the past。
So what does that mechanism look like?y。Lets let's go into it。Maybe yeah, this is, this is smart。
Let's first look at this here。 If you've been in in deep learning and are old like me。
you remember this, this is an LSTM。 This is a long。
shorter memory cell from back when before attention was a thing。
So this was one of the main ways people build RNN's recurrent neural networks that would actually somewhat avoid that vanishing gradient problem and could learn to remember things for a long time。
The idea behind Ls Tms is that you have。Youre the hiddens。 you have two hidden states。If I'm correct。
am I correct。Yes, so you have two hidden states, this C and this H H being the real hidden state。
and you have a lot of these gating mechanisms。What the gating mechanisms do。
it's often represented like this here。 This is an element wise product。
So what you would do is you would give in again in a hidden state, you would get in an input。
youd put the input through some sort of computation, neural networks, non nonlinearities。
yara yada yada, and then you'd have some result right here。
which would be a vector and then the question is obviously you can compute an output from that at this particular time step but the question is how should the next hidden state look like。
And the idea behind LSTMs and similar architectures is that we're going to take the last hidden state。
Sorry, we're going to take the last hidden state。And we're going to update it。
In a if in a really basic RnN we would just kind of replace the hidden state or we would maybe add the two together and then for propagated。
But what an LSTM does very interestingly is introduces these these gates。
So what we'll do is we'll have something like a forget gate。And the forget gate is simply。
A binary or not a binary, but say a, obviously。Continuous。
but we can imagine it as a binary vector where just it's a mask values between 0 and1。
and wherever it's 0, there is an element wise multiplication, wherever it's 0。
this hidden state is going to get forgotten。And then the new state is going to be updated at that particular point。
So there is going to be a forget gate。 There is also going to be maybe a gate right here that tells which things of the hidden state to even remember。
right that's also a binary vector, maybe only these things。
and so the network itself can control which parts of the information it wants to remember。
which parts it wants to forget and which parts it wants to retain and then the new hidden state is going to be sort of an addition of these masked inputs and then that goes on。
In order to do that, there's a lot of computation needed as you see right here。 And in particular。
I want to draw your attention to one fact。 the next hidden states, for example。
if you take this H right here, the next hidden state is always going to be some nonlinear function。
for example, this is a sigmoid。 I believe it's a nonlinearity or a tan H or something like this of something here like of this Ct。
the Ct in itself is a linear combination, but a linear combination of this。
this in its turn again is a non linearity and then a linear combination of the things and this ultimately is the last hidden state。
So you can see from the last hidden state to the next hidden state。
we pass at least two nonlinearities And there you see this sequential stepwise nature of things。
Its always it's always。You have to compute。😡,The step, then you have to。
Compute the next step based on this step。 and the outputs are non linearly related。
So there is no way you can like。Jump a you ahead or take five steps together or something like this。
because they're non nonlinear。 It's not like linear functions。
Linear functions compute really easily, right, No nonlinear functions that are stacked where every next thing needs the first thing as an input。
Those are really not parallelzizable, not。Like agregable or anything like this。
So that's the problem with RnNs if they're formulated like this。
They also go a little bit into the attention mechanism。
which I guess by now I don't have to explain too much anymore。
There is a query and a key matrix both are produced from the data So the data enters and three matrices are produced。
queries keys and values will do an outer product between the queries and keys which defines this quadratic interaction。
So every token can attend to every other token sometimes you would then mask this with the causal mask with the upper or lower triangular matrix。
then build a softm across that。 So the softmax essentially converts some values。
So let's say your values or this positive negative negative positive would convert that into a distribution。
we can interpret it as a probability distribution or you can interpret it as。Essentially。
whatever you want。 But you can and it defines where to put the attention, right。
It defines which things I should look at like this one and this one a little bit。
I guess that's why it's called attention because it defines the weights。
In by which I aggregate information。 So it dynamically。
Allocs attention to some of these values right here, rather than others。
That's what attention means to me in the sense how it's described。
and that's why I said the term is stretched a bit far。
You can write attention in a different way and you can decompose it recurrently almost like an RN。
so you can decompose attention computation, and this is done in parts to also get around the memory bottleneck however you trade it off with computation right if you compute these things in sequences。
you have to compute them sequentially where you could just compute them in parallel by doing a big outer product matrix multiplication。
so you do trade off time and memory here。And by the way。
you have to remember all of these things or you can sum them, I guess。I mean。
any matrix multiplication, you can probably。Do that with。 Never mind。
You can decompose the attention computation。Same one as above in a way like this。
So I have the outer product of just。Pair of keys and queries。
I raise that to the I have the exponential of that。 that's part of that softm computation。
Ultimately I divide by the sum of these values so that's the softmax operator。
and then I multiply the value at that particular location。
So you can see here this part here defines a weight and v is the value。
so it's a weighted sum of the values。Now we come to attention free transformers。
which is a piece of work that this paper takes a lot of inspiration from attention free transformers。
T to go about this in the same way as attention, but they say, hey, can we reformulate this。
this formula up here, the one that we saw。Can we reformulate this and。
Just turn it into something that doesn't need that whole quadratic memory, Chaen。
And they come up and say, if we don't have to do the outer product up here, this outer product。
If we don't have to do these out products, then that would sort of。
Mean that we don't have this token to token。 Every token can attend to every other token interactions anymore。
which means we don't have that quadratic thing anymore。 and therefore。Wei。Would, you know。
we could save a lot of memory。 So they replace the interactions between query and key。
They replace that, and they say, let's, let's not even compute a query。
We'll just compute a key for each token。 So we're now only producing matrices K and V。 no queries。
Instead, we'll have these ws right here, the Ws are learned, so W is a learned matrix。
so not a not computed from the data。But learned, and it just learns how tokens interact with each other。
What does it mean, it means that I just have a matrix。And emphasize size T by T。And in there,1,2,3,4。
5,1。2,3,4, or 5。 And in this matrix, there's going to be number like 7。 Okay。
and that means that the interaction, that the weight, the attention weight。
essentially of that token 1 has with respect to token 2。 So how much is token 1 gonna。
Attend to token to。 Let's assume it's not causally masked。Is 7。Okay, that that's that's that。
it's the same for all the sequences。 you all you just say, well。
the first token is always going to attend 7 to the second token, all the same。
it's one set of learned parameters, and therefore you can this is just now a multiplication by a constant essentially。
Now。That just defines a fixed attention, which is a bit too little。
so the fixed attention is not flexible enough before we had completely dynamic attention and now we go to completely fixed attention that is just learned across the whole data set and the authors there said。
wisely, hey, you know。It is in。 It is the fact that。Depending on the current data point。
we might need to look back further, or we might need to change that attention pattern a little bit。
So they say, okay, how about we simply add the keys here?
So the keys are values that are computed from the data, right?
So now the data can define essentially an offset to that。 So maybe for one data point。
it's eight important because it says token 1 should really look at token 2 and for another data point。
the K is negative one。 So this is6 right here that depresses that a little bit。
So there is a modulation in that attention pattern。
there is one across the data set which is fixed and then on top of that there is a modulation given by each individual data point to modulate that。
However, the interaction is not multiplicative as it is in the transformer attention that you see up here。
it's additive, which is in a sense, a lot less powerful because the multiplicative interaction really defines when two things are close and when two things are far apart between keys and queries whereas here we just multi a little bit that fixed that fixed pattern right here。
However, that fixed pattern can't take into account a token 1。If it decides on its K value。
it can't take into account the what token2 is。 It simply says, I'm the word cat。
I should probably really look three words behind me。 That's really important。
Whereas the original attention can decide, I'm the word cat。
And I should probably really look at words that relate to fish or fur or or sleeping。
Like those words, those kinds of words really interest me。 And that's how it would craft its query。
and that's what it would be retrieved from the keys of the other words。
Whereas here it can just say, well, I'm cat, I should probably look three words behind me Seems really good。
I hope you can see how this is。😊,Kind of less powerful than the original attention。But。
it is more scalable。Again, you see what it defines is essentially this part right here。Is a weight。
so you have awaited some of the values。Lastly。We have this paper right here。
so it formulates the attention mechanism It says yeah but here what we still need to do is we still need to learn that interaction matrix。
which crucially also means it's still limited by T。
It's still limited by you know sort of a fixed size。 we can we can't go bigger than that and。
What they say now is, how about we don't learn this matrix。 All we learn is a vector。
All we learn is the vector W。And the vector W, its the same for all, and it defines。
so it defines it's a vector。And it has the same dimensionality as the hidden dimensions of the hidden state。
And it defines for each dimension, it defines how much。Does the past matter。 So for one dimension。
it could say, well, the past matters a lot, therefore。That value is very high。
And for the other dimension the casino, that value is very low。 The past doesn't matter a lot。
What happens if we do that,Ultimately, we're going to do something like。Again, something up here。
So you can see we have E the exponential function of W T I。Plus, K。Ki。嗯。😊,So。😊,They now say, okay。
we multiply this by this term, T minus I means how much back I'm looking。 So if we wonder。
We are token one。How much do we attend to, or let's go the other way around。 We're token 4。
How much do we attend to token number 2。Okay, then we ask in which dimension in the first dimension。
or, the first dimension is really large。 therefore we're going to attend a lot to the general past of dimension 1。
Okay。So maybe that's this drop off。 And then we look two tokens in the past because the current time step is 4。
and this I here is 2。 So how。Which token are we and which do we attend to。
And you can see it's minus。 So this is getting bigger and bigger as you go further back in the past。
So it's essentially a linear drop off in the value of W and W itself can be big or small。
And these two things together define how important a past token is in that particular dimension。
So it's a multiplication of how far back is it and how much is this dimension in general。
Considering its history。And then you can see it's considering this much。
it's two tokens back so this much attention, and then that is modtable again by a key value that can depend on exactly what the current token is。
So I hope that's understandable, the attention matrix is built on the fly in R WKV。
And it's defined a by the V。 It's defined per dimension。The vector W defines a general importance。
A list for each dimension, it divines how relevant is the past。The second component is this。
it's simply a linear decay on into the past。 So the further back, the less important it is。
That being said, this is obviously then put through the exponential function。
and therefore it's a linear decay in the exponential function。 So I guess an exponential decay。
And then the third thing is the modulation, and this is where the actual value that the actual what the token is plays a role is then to modulate that point we determined right here。
modulate it up or down a little bit also in the exponential function。
So that is how RWKV considers the past in general, it forgets the past in an exponential fashion。
modulated by the global importance of dimensions and a value that's dependent on the current token。
All right, so it has the same trade offs as these attention free transformers。Now。
what do we do with this with these things somewhere we have, we have。
sorry for scrolling around so heavily。Okay。そう。This is how the model is composed。
This is a recurrent application of the model。 So we see the same model applied to three tokens in succession。
So the my name is。Bob, okay, you input my and you're trying to make it output name。
then you input name, so you input my name, you're trying to make it output is then you input my name is you're trying to make it output Bob。
So it's three applications of the same model, so the model isn't composed of these three columns。
but the model is composed of one column and then we just apply that over and over again。
You see it has a beginning, essentially。Which is a token embedding。 It has an end。
which is a language modeling head, which is a fully connected or a stack of fully connected layers that just maps into the vocabulary。
But in the be in the middle, it's composed of。ARecurrent。Or sorry of a series of layers。
So there is in each layer, there is always sorry in each layer。
there is always a time mix module and a channel mix module。
So the time mix module being here and the channel mix module being here。
And those are repeated time mix channel mix time mix channel mix and so on。 And then on top。
there is this language modeling head。So what are the two blocks。
This is a schematic of how the two blocks look like。 I know this is a bit small, but the。
Time mixing is down here, and the channel mixing is down here。
We're going look at this in a bit of detail in the math, But observe right here。
what you always have is you have the input signal。You're going to compute R from it。 R is a value。
That is going to be used as。A for like a gate, a forget gate。
So R always defines how much of whatever is in coming here or whatever is in coming from here。
How much of that do I want to retain and send up to the next layer。
So as you can also see or is computed over here as well。So for every of one of these blocks。
we're going to do a computation over here or over here。
and then we're going to have a decision made by this branch of the computation of how much of that we even want to accept and then send up to the next layer。
So that's the purpose of the left branches of these computation。
There is residual signal across all of these things right here。 So that kind of mimics the。
The state of。Of an LSTM, maybe, but in a, in in an upwards way。 So in a layer to layer way。
So we always have a residual module。 We also have a forget gate in front of adding it to the residual signal。
What does these two modules look like So actually, let's first go to the channel mixing block。
The channel mixing block is very reminiscent of。Kind of feet forward, maybe layers。
So what we have is ignore, ignore this part for a moment right here。As I said。
the R is computed from。The input X。And just a linear layer。 So x times a matrix that's R。
So that's a linear layer that defines R。 Then we have K also x times a matrix。
It's a very simple fit forward layers right here。Then W, which is this part right here, that's no。
sorry V。V is this part right here。You can see that's a nonlinearity and the nonlinearity here is the squared relu。
the squared relu nonlinearity on top of k, and again a linear layer。And at the end。
we are doing that element wise multiplication by this signal right here。
so the R pushed through the sigmoid here is that forget gate that we talked about。
But you can see it's a。😊,Essentially。If you follow if you follow the signal through the actual path of signal。
It starts here x, well that's a funky。X。It's multiplied by a matrix。
so a linear layer that becomes K that's put through a non linearity。
then multiplied by another linear layer。That becomes the value V。
And then send through the forget gate。 So it's essentially。
A feat for neural network with one non linearity。 And at the end。
a forgetgate as like another non linearity。And that's it。 That's the channel mixing module。
I guess it's channel mixing because this matrix, the the linear layers, they do, in fact。
mix the channels, which means that every dimension sort of can get inputs from every other dimension。
which is is a big of a feet forward network。 Now, I've crossed out all of this stuff in the back right here。
So we should talk about this as well。What they do is something called time shift or token shift。
or I believe that's。One of them。Token or time shift。And that is。
they always not only take the input to the current layer at this particular time step。
they also always take the input from the last time step。
and the linearly interpolate between the two。 So you can see here mu and1 minus mu the mu and 1 minus mu or either hyperparameter or their learned parameters。
but they are per operation。 So mu R here is a parameter for the general computation of this R is not dependent on the particular data point。
Only this and this are dependent on the data point with X T being the current input to the layer and X t minus-1 being the last step input to the layer。
So this is pretty interesting because it means that we not only always only take the current input and the hidden state from before like in a general R and N。
but we always take the current input the last input and。This layer, that's it。
But in the time mixing module will then take the hidden state onto these。
That's why in this diagram, you see these these lines right here, these diagonal lines。
Are the token shift lines。 So you see this channel mix module is going to take the current input。
whatever it gets from the lower layers or the original signal and the input to the last to the same layer at the last time step so。
Current input and input to the last time step。 And that also goes in。
These two things are linearly interpolated, and that then is the input quote unquote to the current layer。
So it's the interpolation of the last step and this step input。No。
it's not like we don't mix like the internal states right here。
we mix the inputs before they go into the layer。Now let's look at the time mix。
you can see there is also this token shift happening。 so this token shift。
that's just something you can do, I guess if you have a a one directional sequence that you need to predict。
you can do this token shifting but。What's also interesting is we have a second line。
which are these states。 So how does that work, and that's going to be now the actual recurrent part of this model right here。
You can again see here we're always working with the token shift, we never just work with the input。
but you can just think of these things here always as like X, sorry。X tilde。
where x tilde is a mix between the current。Input and the last layers input。So we have we compute R。
which is it's just x tilde times w times a feet forward layer。
and that again becomes the forget gate down here with an elementwise multiplication。
we do have an output layer, an output sorry we do have an output feet forward layer kind of a projection that's I'm going to guess they put that in because it was advantageous to do so it can also change the dimensionality and whatnot。
Then we're going to compute two things K and V。 So you'll notice before。
Whatever was called V was produced from K, but now both K and V are produced from X。
I don't know why they call them the same, probably to keep as much in line with the transformer terminology as possible。
but it's really there's no relation between like the V here and the V before the K is computed similarly。
So this block right here, the K and the V are computed。
Modular the time shift as they are computed in the original transformer architecture。
Which is just the input times a linear layer。Then what happens is interesting then。
As you can see right here, we go into this, into this weighted sum。 So youll。
you'll see something familiar here。That's await weighted, await weight and V T, That's the values。
So V, we computed here。 So we're going to look for a weighted sum of the values B。But, oh, sorry。
No, no, no。 forgetget that。We're not only going to look for a weight that sum of the value V because you also see here are V's。
but these are Vs, and this is V T。 The Vs, in fact, are the past values。
So we're going to look for a weighted sum across the entire。Asked。And that's actually, oh, sorry。
It's actually the same。As before。Yes。Blan me back up。So that I here only goes to t minus1。
So you can see that we sum the Vs here, and then at the end we also sum the VT。
The only reason that there is a difference is this U right here is a different parameter than those ws。
but is in essence, it's again a weighted sum over all the values and the values are from the entire sequence。
So so far, we've just considered the current time step, the current input, and yes。
the last steps input, but in this step right here, we consider the entire past。
And we want a weighted sum。Across the values of the entire past。
like in these attention free transformers and whatnot。
But because we now no longer are limited by having this fixed size。
this fixed size attention matrix, right here, or even if it's learned, right。
even if it's not an attention matrix in the attention for transformers。
it was still a fixed size because we're no longer limited because all we do is we say how important is each dimension。
And how does it decay with time in the past。
That does not is not limited back in time。 It just gets really small back in time。
but it is not limited, and therefore。We can do this until perpetuity。
And especially we can do it until I equals one。 So going back to the very first token。
So for every token that we need to do inference for。 This step。
this value right here will be awaited sum across the values of the entire past, right。
and you can see easily that you can do this in a recurrent fashion, this is a, it's a soft max。
And you can see there is exponentials that here and。😊,These are multiplied by the values。
And down here we go just over some of the exponentials。 So it is a soft max。 However。
you can just keep track of the the numerators and the denominators separately。
And then that becomes your hidden state and you can pass that forward。
So you just grab this sorry right here and this down here and before dividing them。
you just pass them on right and then in the next step, you simply add something on top。
divideiv them for the current step, but then pass on the hidden states separately So that's what they mean by states if they say。
They don't mean the United States。 I'm sorry。 They mean these values here that you need。
You can compute this in a recurrent fashion, or you can compute this in a parallel fashion。
So just to finish here quickly, this value here, this weighted sum over all the values of the past is then。
Feit fed into this forget gate, as you see here, and the output is computed from it。Now。
multiple things to note right here。 multiple things to note Note that the aggregation over the past here contains essentially no non linearity。
right because。V, the thing that is being aggregated or in general, these hidden states。
they're just produced as a linear function of a linear interpolation of the inputs。 right。
There is nowhere where the previous state goes through and on linearity in order to compute the next hidden state。
You can essentially track this as a。A big sum。 So as as a list。
you can track it as a list and then do the sum or you can just track it as the sum。
which also means that。The parallelism of training this becomes feasible again。
so you can train these in parallel because it's just all a big sum that you can compute for an entire batch and an entire sequence at the same time。
And, yes, also, you can use it in an or and fashion where you do it step by step。
But because that's because it has no non nonlinearities in between。 it's it literally just a sum。
And that's also why you, why you see what I mean, This is essentially a convenet。 And I mean。This。
it has two parts, right, The first part is this stuff right here, this token shift。
Look at the diagram and the diagram you clearly see。If you are this element right here。
what do you have access to, you have access to this。And this。Oh oh by extension。
you have access if you just go via the token shift。
you have access to this and this right and so from the lower layer to this and this。Right。
so by here。 So you have a receptive field that grows with depth。 right, If we had another layer。
the receptive field would grow again。 So the token shift itself is already is sent very directly。
a convenet and you。You know, you only have known nonlinearities as you cross these layer boundaries right here。
otherwise it's essentially just a linear interpolation。
which is exactly a convolution with the kernel being mu。And 1 minus mu。
That's your convolutional colonel。 subsse,2。 You slide it over。
So that that defines a con convolution and the same thing for these things right here。
that is very reminiscent of if you know about these like S4 or state space models and so on。
which essentially what they do is they define a way to linearly aggregate the past, right。
which is exactly what this big sum is right here, they define a way to weighted sum across the past。
that in between has no no nonlinearities, So you can just track it like this。And。Yeah, so。Again。
and, and S4 is essentially like a big convolution。
So if you want to think about this model in another way than a transformer or an RN。
that there are not already enough ways, it's essentially a big conve。
Particular in this way right here, it's a conve that has sort of an infinitely long convolution into the past or until the beginning of the sequence。
I guess。 And you the way it's done is there there is a standard con kernel。
And then that's modulated by these K values right here。All right, so that is。How that works。
I hope I've made this a bit clear the why this is called channel mixing and this one isn't called channel mixing。
like this is just as much channel mixing as the other one is, the only difference is that down here。
there is kind of a non linearity within the layer。And there is and, and here, we have this。
Aggregation over times, I guess calling this time mixing is fair。
But this is just as much channel mixing, because。These feet forward layers, they mix the channels。
Yeah, but that's that's naming that doesn't doesn't really matter。 So they specify here。
this can be used in time parallel mode complexity of processing a batch of sequences in a single layer is this so you can process a batch as a batch。
right。So it requires they say meanwhile updating attention scores requires a serial scan and has a complexity of this they've implemented this in a custom kuda kernel。
you can actually go look at the code I've done that and it's fairly easy to understand the kuda code is one of the more understandable pieces of kuda code and you just write this function Kuda takes care of sort of parallelzing that and putting that across cores and workers processes and so on。
The element wise computation is time dependent but can be readily parallellyzed along the other two dimensions。
On the other hand, you can also use this as in a time sequential mode。
Can be conveniently formulated recursively for decoding during inference。哦哦。Mai。
Connection here is spasing out。One second。
And we're back。Yeah, so they say each output token is dependent only on the last state。
Which brings obviously all the advantages and disadvantages of R N Ns with it。 So, again。
we can only consider information coming through this bottleneck of the hidden state。
But I feel because it's this big sum of aggregation is essentially a weighted sum across the past and not non nonlinearity across non nonlinearity across non nonlinearity。
It can much more easily look back into the past in, but it can do so in a linear fashion, right。
So I feel this is。Among all the situations like Transformer, LSTM and this one。
this is probably the weakest form。Of being able to look into the past with nuance。
you can look into the past, but you can only do so in like a general fashion。
whereasas a transformer can go look into the past and have exactly the same amount of detail as it does for the recent past。
So it can look into the long past as long as it's within the context and do exactly the same computation there as it can do for the recent past or for the current token。
whereas an LSTM can't do that。 It can't look into the past at all。 However。
it can do a lot of considered computation in each step before it saves it to the hidden state。
So it's weaker because it can't go back but still, it can do a lot of complex computation。
This model right here。😊,It can look kind of, it also goes through the hidden state。
but it can look the easiest much more easily into the past as an LSTM because it's just this weighted sum instead of nonlinearity after nonlinearity。
but it kind of has the weakest form of computation that it does in in the exact moment。
I hope that makes a lot of sense that is not a scientific statement that is just me trying to ramble。
Maybe I'm also totally wrong about this。 or maybe, you know。
you can easily make up for that by stacking a lot of layers because now this model is being able to be stacked really heavily and be scaled really heavily。
And that is probably enough to make up for all the lack of computation in the individual cell。
It's just like a let's just stack the stuff。Yeah, another property that I have mentioned。
but is not entirely maybe come through is the fact that they always compute from the inputs so they don't take。
they don't take necessarily the the hidden states over so but all the functions are like linear functions or exponentials of linears of the inputs。
So there's no like non nonlinearity in between that time aggregation and the。
And where and the inputs it themselves to the layer。Sorry enough, Rammbling。
here you can see scaling behaviors, very, very beautiful, cumulative time during text generation。
as the tokens go up, obviously this model has a linear scaling where everything else goes b。😊,是。
The experimental evaluations are also really interesting。
at least at the data sets that they have considered right here。 it can hold its own。
Sometimes it's a bit better。 sometimes it's a bit worse than other similarly sized transformers。
but it it performs。Along the same lines。 now, I have heard people say that the model is qualitatively not as good。
I have as transformers of the same size。 I've heard other people say it is better or for some things。
it's better。That I don't know。 It still has to be shown。
Also these challenges or these data sets right here。
Don't really show me what I would want to find out。 So if I compare this to a transformer。
what I would want to find out is。How like where is the, where then is the actual difference, right?
And I'm going to guess the difference is, let's compare something that is not in the recent past。
but a bit more back。 Now, if I have to consider something that is a bit more back in the past。
And if that's a very complex thing。Whose or the computation of which。
Like how I have to treat that depends on the current token。
I can't really tell you now an example for that。 but in a situation like this。
a transformer would be way superior than like any LSTM or this model right here。
So maybe during programming in certain fashions or if the context for something is only given much later。
But for a lot of applications, probably not that important。
They also can show easily how increasing the context length since they can do that now。
increasing the context context length nicely decreases the loss of language modeling on the pile data set and they give some。
Some suggestions right here。 So for example, improving computational efficiency by applying a parallel scan in this step to reduce the computational cost to this。
which would be another improvement that's theoretically possible。
but I'm going to guess that's not done right now。嗯。They also discuss the limitations。
so they're very open about the limitations and all the comparisons right here, right this is。
The linear attention leads to significant efficiency gains。
but still it may also limit the model's performance on tasks that require recalling min minnuier information。
Over very long context。 Okay, that's essentially what I was trying to describe。 But it's。
it's done in much better words than I did。The recurrent architecture inherently limits its ability to look back at previous tokens。
that's like an RN。 And they also discovered that there is an increased importance of prompt engineering comparison to standard transformer models。
So there are multiple hypotheses, the one they give right here is the linear mechanism limits the information from the prompt that will be carried over to the model's continuation as a result carefully designed prompts maybe even more crucial for the model to perform well on tasks。
it could be it could be that that is the reason there could also be other reasons maybe this model overfits a bit more so or is less generalizable。
and that's why changing the prompt really matters more although maybe not。
mIt's just one of these things where there is probably a thousand possible explanations of why with this model。
The getting the prompt right really matters a lot more than in a transformer。But I I wouldn't put my。
my bet on any one of those until we have really good experimental confirmation。
There's usually a lot of。A lot of。I shall I say。There's a lot of Okhamm's razor that should be done。
Alright, the last thing I wanted to show was this experiment right here, which I found really cool。
So the first one is this time decay, so。😊,Comicate sorted along channel axis。
which is where you can see the the difference。 So here is the channel。 This is the dimension。
right This is the dimension。 We're looking at W right here。
This vector W how important is the past in layer 1 you can see as far as I can tell the past is not that important。
So for many of the channels, the past is kind ofba for some of the channels。
it's sorted by that value。 So for some of the channels。The past is important for, for a lot of them。
It's really not really not important。 And you can see as you go up the layers of this network。
they more and more and more consider the past。And then what's interesting is the drop off right here。
So you have some channels really specializing in near term information。
but a lot of channels really looking back at at the long time into the back。
So the W will define almost no drop off whereas at the lower layers you have much more local information that the thing considers。
So I found that pretty cool to see that visualized and to see that progression as in a trained model as you move up the layers。
The second visualization here, it's an example。 So here you have a input of tokens。
the Eiffel Tower is located in the city of and then they look at how likely is the word Paris right here。
😊,And what they do is they。Change。In each layer, they change in each layer。
they they swap out the weights or they disturb the weights。
and they see how much influence does that have on the probability of the word Paris appearing。
This is a way we've previously looked at that in the paper on Rome, I believe。
was the technique where you can it's a way to figure out what are the important information paths that you're considering。
So in this case, you can clearly see。After the I fell, we see that layers 1 to like。
20 or so light up, right。 And after that, it's what's, what's cool is。So, after that。Only layers。
whatever 21,22 and 23 light up until the end right here。 So only these light up。
which means that you can, you can disturb these lower layers right here。
because the information that Paris should probably is a very likely word has already passed from the lower layers to the higher layers right all the way up and is then stored and carried along in the hidden states of these higher layers across these tokens。
such that the information in the lower layers is only mildly relevant to the output right here。
Of course, it is relevant。 There is not zero values right here, but it is mildly, mildly relevant。
So I thought that was a pretty cool visualization of what was going on in this model。
Let me quickly scroll through and see if I forgot anything。 I did not。
There are some examples at the end, which is pretty cool。 The models are available。
You can go check them out。 you can go test them。 the code base is also。
I found it to be fairly understandable。 So if you want to go look at that, it's also available。
And yes, my。😊。
Thing is spasming out again。 That's where I'll end it。 Go check out fully connected。 again。
code is in the description to get you some discount If you're in San Francisco。 June 7。
I unfortunately will not be there, but many, many, many, many cool people will be。 How is it。
Thank you, bye bye。
【项目原作解读】RWKV Foundation候皓文: 新型RNN模型RWKV,结合Transformer的并行化训练优势和RNN的高效推理 - P1 - AI试库の小土同学 - BV1Tu411Y79S
。呃,欢迎各位观众今天来参加我们的直播。我受这个彭博的委托来给大家讲一讲我们的paper raku。啊,对,这个的话标准的发音叫raku,不只是不是不是这个RWKV。嗯。OK好。
那咱们今天的直播就开始吧。
首先先讲一讲核心卖点吧,毕竟大家的时间都很珍贵。嗯。让你先看看我们的核心卖点,让你觉得值不值得把这个整个直播看完。首先主要kuve的核心卖点是OE的推理复杂度是真的很香。首先。
单投ken的推理时间是恒定的,总的推理时间随序列长度线性增加,而传统的transformer呢是随序列长度二次增加啊,甚至有可能三次增加。在特别长的序列情况下。内存占用恒定,不随序列长度增加。
第三点呢是推理时间。和内存占用。呃,都是随随尺模型的尺寸线性增长。大家可以看这两个图啊,就是为了表表达这个推理时间。和内存占用其实。都是随模型尺度线性增长的。
可以看到其他的transformerQ就飞起来了,这个是它的啊内存的使用。这个呢是它的推理时间,也是Q就飞起来的啊。我们可以观察到数量级别的优势。在这个方面的话,所以说这也就意味着。大模型的硬件限制。
和部署成本。所有如果使用抓Q模型的话,可以大幅的降低。我们已经在CPU和非NV的加速卡上部署raku模型。这个的话就不再受美国卡脖子的限制了。你买不到英伟达的显卡也没有关系,用你的CPU就可以跑大模型。
然后呢,是服务器上的大模型部署成本可以大幅下降。普通的台式机和笔记本的算例。内存就已经足够部署一个本地的大模型。手机端将来也成为可能啊,手机端现在的主主要问题是内存还太小。如果手机芯片厂商进一步跟进。
例如说加入一些PF16的尺寸的啊这种这种数据格式。那么未来也有可能手机端可以部署啊,但我我是比较乐观的,我觉得可能。一年甚至两年啊,就可以部署这个在手机端部署大模型了。所以说不夸张的说。
我们觉得raku将推动大模型进行一次。架构迁移,从现有的transformer架构迁移向reku这一类的线性transformer,或者叫做线性attention的模型。OK那你看香不香啊。
如果觉得足够香,那就跟着我继续往后。看我的直播吧。OK那么就回到这个一开始先介绍一下。RNN和transformer各自的局限性。首先这个RNN吧它训练长试液的时候容容易出现梯度消失的问题。
所以前十0年20年都提出过一系列的工作,如GRU如LSTM。就是来解决这个长序列梯度消失的问题,但解决其实也不是很好。LSTM差不多在100个token或者说100个字之后,它的。梯度就停止下降了。
说明他已经开始遗忘过去的信息了。另外一个问题呢。是安安在训练过程中无法进行并行化。他也是必须每一步一步的进行训练,限制了其可扩展性。这就是为什么之前的RI模型都没有办法训练的很大。就因为它没有办法并行。
就使得他有就算力用不上吧,可以这么说,所以之前都没有得到过很大的RN模型。然后transformer的问题呢是传统的transformer或者说标准的transformer。
它的tension是具有二次复杂度的。在长序列任务中呢,计算成本高,占用的内存多。我们可以看一下。右边这张图表啊,transformer在时间上它的复杂度是T方。空间上的复杂度也是提方。啊。
T方站主导的T的话就是序列长度。Araku。时间上是。OT的复杂度,而空间上是OD的复杂度。D的话在这里是一个常数,就只是它隐层的向量大呃隐层的这个维度,也可以简单说,它就是OE的复杂度。啊,所以说。
本文呢主要是提出了raco架构,它结合了RN和transformer的优点。同时缓解了他们已知的限制。好,我们提出一种线性的线性注意力机制。最后呢我们展示了raco在。
大模型长距离依赖关系任务中的性能效率和它的可扩展性。OK来讲一讲RNN它最简单的形式是什么样的呢?那最简单的形式其实就是XT是它的输入。HT呢是它的影像量。然后呢,每一步我们会有一个遗忘门。
决定这一步我们把多少信息放多少输入信息和多少上一步的影像量信息放到这一步的影像量信息当中。啊,可以看左边这个图啊,右边这个图就是这样的一个意思。所以说RN它是一步一步执行的。嗯。
每次只能处理一个字或者一个词。如果你分词的话。它的内存占用很小,它计算量也很小。因为它每次值处理一部的数据。但是呢因为他对前一项是有很强的依赖的,这里指的话就是HTI。啊。
H确是这个HT减一是它的所谓的前部,是它很依赖的。所以说使得它没有办法并行化训练,这极大的限制了RN的可扩展性。相比较transformer呢它一次性是可以处理一整句话或者处理一整段话的。
所以说是可以并行训练的。OK那我们下面再讲一讲transtransformer的attention啊,和我们从transformer attention中受到的启发。
然后提出了我们新的attention机制。哦,这里的话是传统的tstion,然后对它进行了一点改写,改它改写成向量版。你可以这么理解,就是对于某一个T当前啊这T就是当前的token或者字或者词。
我们使用它的呃cory。和他的key和和不是和他的和他所有的key和这个序列里面所有的Tkey计算一个分数。然后这个分数呢再对。它的直向量进行加权求和。那么我们就可以得到。这个T它的一个向量了啊。啊。
下面这个呢是一个规划项,也是把所有的它的。现啊所有它的这个叫做啊注意力的分数给它加到一起。大家要需要理解的话,可以看一下左边这张啊,右边这张这个图。然后AFT呢是指。
pottention free transformer是21年苹果的一篇论文。他在这个里面呢,它把QT乘以KI。改成了WTI加上KI这样的一个格式。这个格式的特点在哪里呢?嗯,这么说吧,我先换支笔。
这个WTI它是一个矩阵。然后呢,是T乘T的矩阵,就是说它是序列和序列之间的矩阵,它代表的含义呢是一个位置的token对另外一个位置的位置偏置呃,positional bias。它是一个固定矩阵。
就是说它对于所有的词,所有的所有的序列而言,它都是固定的。啊,那这个的话就很不好了,就太静态了,没有没有办法学习到很多的知识。所以呢。作者又使用了1个KI,这个是和每个token强相关的1个KI。
用这一个值来调制它的这个啊positionpositional bias可以给把它调的高一点,或者把可以把它调的低一点。通过这种方式呢形成了一种线性的attension。然后很受这个想法的启发吧。
就是说哎那就可以摆脱了这个Q乘以K的乘法,对吧?那也就摆脱了,不再需要依赖之前整个序列里面所有其他值的这个限制。所以呢raku就提出了一个channel wise的时间衰减向量,就是这个W。呃。
这里先解释一下channel吧,因为这个channel和可能大家在其他配per里面看到channel和CN的channel是不一样的。这里的channel其实就是。就是隐藏隐藏层的维度就是。
D啊它就是一个W,就是一个D位的向量。每一个其中的一个值,我们称之为一个channel。啊,你。OK好。那么这个公式的含义是什么呢?就是说比如说我们有128个channel。
然后它前一个向量就是-1W前两个向量就是-2W前三个向量就是-3W,它都是跟自己的位置和它之前的token的位置有这么一个关系。因为它是在一当中的,它又是个负值。所以他其实就是一个时间衰减下来。
你可以简单简单的理解为。距离当前token越远的token,它就会衰减的越多,越近的token,它就会衰减的越少啊,但实际情况下比这个还要复杂一点。
后面我们有个图来可视化这一部分channel的信息衰减。好,这个其实就是reco的一个核心思想。我们下面来完整的介绍一下reco的架构吧。首先,raku里面的RWKV分别是4个字母。的含义组成的啊。
这四个字母呢是R代表一个过去信息接受程度的向量。W就是刚才说的时间衰减向量。K是间值向量,就是之前说的用每一个token自身的一个值来对位置向量进行调制啊这么样一个向量。V呢是每个token的值向量啊。
它也类似于传统注意力机制中的V。然后我们来观察一下一个embedding进入reku之后会经过什么样的一个东西呢?首先它会进入time mixing模块,在time mixing模块里。
它会和它之前的所有的文本信息进行一次融合,所以叫time mixing,它会把过去的历史信息加到自己的身上来。然后呢,经过一个lay norm就进入到channel mixing。
channel mixing设计的目的呢是因为time mixing,它其实并没有考虑到每一个词,它每一个维度之间的这么一个非线性啊,所以在这个模块里面呢。
会对每一个词的它本身的channel进行一个强烈的混合和非线性,增强它的非线性能力。使得模型的学习能力更强。好,那我们来讲一讲这个time mixing到底是什么样的一个含义吧。嗯。先来看公式吧。
这个time mixing里面你会发现就是之前讲的那个W向量,它是有两部分组成,一部分呢是之前的所有的。呃。这种时间衰减的向量乘上它之前的token的。直件向量和它的直向量进行聚合,得到的这么一个东西。
然后加上当前token。的一个。呃,权重对吧?这些权重和它的一个直向量。那U呢是单独设计的一个专门为当前token的而设计的一个。举证吧啊,这样这样的话,可以把和之前的向量区分开来。很更大的一个问题。
根据之前的公式,你会发现,如果T减T到就变成零了,对吧?那你不可能用零乘自己的这个限值加自己的键值嘛,那不就没有学到东西了嘛?所以说必须换一个向啊换一个向量来表示它。😊,下面你层依然是个规化函数。
我们可以用这个。右边的图来解释一下它具体是什么样的一个过程。呃,首先对于第一个偷token进来的时候呢,你会发现它会和EW这个向量里面的这一列产生作用相乘,得到一个新的Ebedding。
当我们往前走一步。你会发现它是这当前第二个向量和它前面的向量呢,会和它的时间衰减的这个矩阵啊做一个就是点对点的乘法吧。然后以后以后以后又是形成一个新的项链啊,第三步和第四步都是一样的。啊,同时你会发现。
因为时间衰减向量,你可以看到当前token它的这个向量的强度一般是最大的啊,然后呢它会逐步的减小,颜色逐步的变浅。也就说明这个时间过去的信息在当前这个token这里看的话啊。
它的信息的重要性在逐步的降低。通过这样一个方式呢,我们就实现了一种新的线性复杂度,就是这个。WKV啊就表示一种新的线性复杂度。这个新的线性复杂度,我觉得重要的意义在于。
它其实上用一种接近EMA就是exsponential moving average,就是指数平滑啊移动平均的方式,把过去的信息都加到当前的token里面来。啊,这其实是一种序列建模的方式。
我们觉得这个方式其实非常好。另外一个点很重要的话,我想提一下,就是你会发现哎这一部分。😊,和这一部分。都是过去可以提前算好的。把之前的信息算好了,传进来放到一个state里面。
就可以直接和新的两项相加一下,就可以算出新的WKV啦啊。这个的话其实就是raku可以RN模式运行的基础。后面我们会更详细的讲一讲一下这个东西。好,当。一个token经过了time mixing之后呢。
他又会来。进入到channel mixing的模块啊。像我说的channel mixing,它主要是为了给这个token它的channel之间加逞强的非线性。所以呢这里使用了。
这个叫square loop,就是说啊这么是一个很强的非线性函数,一个sigoid的函数,也是个非常的强的非线性函数啊。😊,就可以对这个每个token它的 channel进行一个mixing。好。
那后这一篇页PPT的还有一大目的呢是要讲一下这里。WT和啊不是WTXT和XT减1,这个就是论文里面提到的token shift操作,就是token的平移。我们会把每一个当前输入和上一步的输入一起加到。
一起加到它mixing module和这个channel mixing module里面来啊,像这样的话,其实也会很多种理解的角度啦。一个角度就是说强行做了一个by ground。
这个是一种NLP的角度,认为说我强行的把所有的字组成一个词啊,组成一个只有两个字的词啊,这是强行的bground这是一种理解方式。还有一种理解方式呢,其实可以把这个理解为一种CNN的过程。嗯。
在这个CNN里面呢,它相当于是一个窗口为2。一个参数为UR,一个参数为一减UR的。卷积神经网络。啊,从这个角度来看呢,你会发现。随着整个信息在向上传导,整个模型叠加的模块越来越多。整个模型在这个地方。
它的感受也是越来越大的。我可以简单画一个图,你们可以感受一下啊。首先对于第一个token而言,他能看到token就只有他自己。对于第二个token而言啊。
他其实他可以看到的东西是他自己同时他可以通过这条通道这个token shift通道看到他前一个token,对吧?那么他其实现在的感受也就是2。对于第三个头盔,这里可能不太准确啊。
他可以通过自己的channel看到自己。通过这个 channel呢看到上一个token。再通过这个channel能看到上上一个tken,这个时候它的感受也就是3。如果这个模型可以堆叠100层。
那么我们可以说这个模型在最高一层的时候,至少它会有100的感受。就是说它可以直接看到100个位置以前的token啊,这个在我们看来,这是很强大的一个序列建模能力,通过这种token shift的方式。
使得模型具得具有了非常巨大的感受。那某种角度说,如果你能把它对到1000对吧?那它其实就相当于可直接建模1024,或者直接建模1000长度的上下文了。
所以说这个token shift在我们看来也是这个模型设计中一个很很很很不错的点吧啊。好。下面来说一下。模型因为这样的设计,它就可以高度并行化啊,因为你可以发现这样所有的这些值它都是可以提前算好的啊。
都是可以通过矩证计算的。它脱离了对上一个状态的依赖。然后呢,WKV使用一个串新的扫描,就可以把它计算出来。这就使得它可以像其他的transformer一样的并行训练。
一次把整一句话放进去就可以计算它的lo。像样这样的话,就使得它的可扩展性和transformer是一样的。好,下面来讲一讲它是怎么像RN1样解码的。我之前留了一个线索吧,对吧?
我说这个项呢其实可以等于它之前的项加上它现在的项相加。你每次只要把它之前的这一项和这一项当做一个state传进来,对吧?那它就可以马上计算这个状态下的WKV了,所以简化之后呢,使得整个模型。
就变成这个样子,1个IN的形式。我只需要把当前的token和它的state一起传进去,会返回一个新的state。要下一步再依据这个新的state再去计算。
每次我只依赖上一个状态state和当前的token,我就可以快速的对模型进行解码,这就使得模型摆脱了它之前的上下文啊,使得它每次只依赖前一步的state,极大的提高了它的计算效率,降低了它的内存消耗。
好,让我们来看一些关键的结果吧。嗯,首先reco通过三种机制。循环时间衰减和token shift来捕捉序列传播中的信息。循环我觉得这个呃这个我觉得这个有点不好讲啊,这些是常识。
就是它每一步其实都依靠前一步输入进去这样的一个循环计算过程,本身就是一个序列建模的方式。时间衰减之前说了,是通过这种channel之间的时间衰减的这个量来捕捉之前过去的信息。
然后tokenship刚才也说了,是相当于一种CN的窗口。当模型堆的足够高,它的感受也就非常大。那我们可以看一下,这个是之前LTM的一个呃pro token loss,就是说在。
就是说计算这个los在100位置的时候,就会发现它已经饱和了,基本上就没法下降了,说明STM把它100个token之前的信息都给忘掉。他没有这个长序列捕捉的能力,但rakuve可以做到多少呢?
至少现在可以证明他可以做得到。4096的长度啊,在4096的实线上,我们发现它的los还在下降,它并没有体现出任何平台性,说明它的长程序列捕捉能力是非常强的,至少在4096的上下文下。
它依旧可以捕捉到之前的信息。好,然后来看两个可视化的结果。嗯,这个是之前留说过的,就是他对于每个channel。之间的信息是怎么传递的啊,它表现出来是什么样子。我们可以看一下,就是这个其实很有趣啊。
第一层第一层第一层的话,你可以看到它在后面这些channel的时候啊,这个总共是有74七84维啊,所以说它的这里划到是接近800。你可以看到它后面一些channel,它基本就衰减为0了。
意思就是说是这些channel我根本就不关注之前的信息,我只关注当前信息,我不去捕捉之前的信息,我只关注好当前的token是什么样子的。但是随着模型层数的上升,你会发现高层的channon第12层。
它已经有很长的一个平台了。这说明什么?这说明在第12层的时候,它是一个全局的视角,它会从全局来看这个信息,它会保留之前的信息非常长的时间啊,它的都不衰减。它的这个它的这个time bK都接近一。
然后最后这这就是使得它具有了一个很好的长啊,这种长城信息捕捉的能力。OK另外的话我们来看一下。使用因果追踪方法来展示这个信息的传递路径。
这里呢输入了是the ever tower is located in Paris。我们预测paris过程中,这个模型的信息是如何传递的呢?首先你会发现。当模型进入到第四个位置,第四个token。
这是这时候af这个词已经完结束了。模型就会通过一条路径把它传递到。20层21层这样的位置。然后在这个地方储存着这个重要信息。当模型继续往前的时候,这个信息呢也在不断的被向向前传递向前传递向前传递。
而且你可以发现它有两条路径在向前传递。当最后我们要预测它的时候,它就被传递到最后一个位置,告诉我们说。因为埃尔铁塔在paris,他们两个有高度的相关性嘛,他就可以正确的预测出paris。
这个可视化也是很有趣的。他展示了说R客模型到底是如何处理,在它其中的信息的。其实。他在看到efer的时候,他就已经猜到了,可能后面这个信息很重要,要把它用到哦,然后就把它放到了比较高层的一个位置。
储备着啊,如果你之后真的是要问他和everer相关的信息,那他马上就会把这个储备信息拿出来。然后把它用于预测,帮助你得到正确的答案。好。下一页是一些evaluation,这这一页也非常重要啊。
因为之前声称做transformer线性化的工作非常多啊,但是其实他们都没有办法接近一个真正transformer标准transformer的效果,所以大多数人都没有跟进啊,因为他们的性能损失太多了。
虽然你各种效率上有很大的优势,但你性能损失这么大的话,就没有办法用。但这个评估过程中,你大家可以发现,在多个数据集上。把酷5的效果都是非常好的。甚至超过了一些同参数的OBT呀。
blumom呀这样一些基于transformer架构的大语言模型。好。哎,还但于这里我还想分享一点,就是说其实在我们看整个结果的过程中,我们发现其实raku模型它当它的这个。参数量不是很大的时候。
其实是有一些劣势的啊,例如说。这个时候这个这这个嗯朗姆da这一个测试集,这个测试集非常有意思,它是一个能够证明你模型序列捕捉能力很强的测试集。因为它相当于它每次只要求你测试它最后一个字是不是正确。
一开始的时候,在模型参数较小的时候,其实它和transformer之间还是有一些差距的啊,因为transformer它因为可以保存过去所有的信息。每一次去请求,他都可以把过去所有信息拉出来重算一遍。
就使得他在模型参数小的其实优势很大。把Q模型这个时候略趋于劣势。但是当模型参数上升到7亿,我们看到的是差不多7,不是7亿7B70亿参数的时候,就已经开始接近transformer的效果了。
等到14笔就是140亿参数的时候,集和银和transformer效果不相上下了。啊,说明其实对raku模型而言,scaling它获得的收益更大。他sing获得收益大于transformer。
我们分析的原因是这样的,transformer架构是非常强大,是非常通用啊。但是呢它对于很多任务来,他这么强大的模型效果可能用没有办法完全发挥出来。嗯,而recqui呢它虽然有一些局限性。
但是呢当它的模型参数逐步增大之后,它的模这些局限性就被克服了,使得它在足够大参数情况下,效果可以快速提升,然后就接近transformer的效果。所以说其实runQ真的是一个大语言模型时代的产物啊。
因为对于他而言,如果所有的模型都停留在berrt级别,那么它可能就没有那么有价值。但它真的到大语言模型时代。比如说模型参数70比7B14比甚至更大。在这种情况下,它的优势就体现出来了。好。
然后是核心卖点了,就是推理复杂度,生成长度为T的序列transformer需要T方的这么一个复杂度。所以说真实在真实的测试下,它也是受它整个这个需要的时间就起飞了reco它是一个线性增长的啊。
所以说对于特别长的文本生成。那么reccove在推理效率上就有很大的优势。然后是一些我们在呃。非GPU架构上的结果,例如说在CPU上,raku可以使用int8模式。in特8模式的话。
它的los损失非常小。延迟很低啊,同时模型参数也不大。它就可以快速运行,而且可以编译出各种各样的ESE支持的平台。包括。inux呀、windowsmac arm都可以支持。然后呢,是也有了主要客户。
也展现出大模型在端侧匹配的潜力。简单说就是说。CPU上16G内存就可以运行70亿参数的模型了。然后12B的话可以运行in8的71毛钱。在英特尔BF16的芯片上的话,它的速度可以更快。然后在GPU上。
15GB的显存可以运行70亿参数的模型。9GB的显存可以运行。可以运行int870参数的模型。那这个就是真的是入门款的GPU就很多都可以支持支持大模型的推理了和和啊对。
所以说这也展现出raku在端侧良好的潜力。如果之后模型再进一步做一些小型化。那么同时手机的性能再进一步加强。那么部署到手机上也是完全有可能。好,最后总结一下吧。首先。
这个raku提出了几种关键的改进策略。首先是实现了线性注意力的RNN,使得它的复杂度呢从T方降低到了T。实现了高效的并行训练和高效的创新推理。然后还有一些更好的初始化方法啊,这个没有讲。啊。
但其实在论文里面是有的,就是。大家可以去啊看一下,感兴趣的话,例如说一生叫啊small embedding initiation就是把传统的呃。参数初始化的维持度啊,又下降了2到3个数量级。
这样的话模型收练初期收练会更快啊。这都是反正我觉得论文里面其实宝藏很多了,都是彭博和大家长时间实验得到的一些珍宝吧。希望你能够从里面发现一些有价值的东西。
好,然后就是raQ5的局限性啊,这一点我们也毫不避讳它本身的局限性。因为它的这种RN的架构其实限制了他的回望能力,就是说他必须还是说他没有办法重新得到之前已经丢弃掉的那些信息,对吧?
他只能通过一些记忆或者压缩的方式,把之前的信息保留保留在这个模型里面。如果这个模型它真的很需要非常细节的回忆,就要非要需要回忆非常细节的内容,那么可能如果模型在之开始对它的重要性判断错误的话。
那可能就没有完整的保留下来。当它传递到后面的话,可能就忘了啊。从这点上来讲。和完全的自注意力机制相比呢,机制上是存在一定的限制的。啊,但是就像我们说的,因为你要保证完全的自注意机制。
你就必须把之前所有的上下文都带着计算。那这个计算的成本是非常高的那我觉得大家可能需要做一个权衡的。你真的觉在你的业务上,或者在你需要做的事情上有这么重要吗?
还是说用我们reku的方法就可以很好的解决你的业务了。那么你这个时候也许不需要保留所有之前的信息,那也就不需要用传统的transformer架构了。另外一点呢。
其实我们发现racco其实对prom engineering更加敏感了。呃,就像我之前说的,因为回望的机制,使得说那么你一开始可能就是更需要告诉他一些任务相关的重要的东西啊,他通过这些信息。
他才能更好的帮助后面的模型进行预测。所以精心设计pro的更加重要啊。你会发现,如果这个pro设计不好,它的性能可能就不好。但是他如果pro设计的呃好一些,马上他就可以和同等尺度的transformer。
性能基本上就是一模一样的。好,然后最后说一下未来的改进方向吧。啊,一个的话是。并行扫描。这个的话可以使得它的这个计算成本进一步降低到loglog t啊,这个的话我觉得也是很有价值的。
就是说是那你T如果很长1天01万10万,那对于log T而言,那这个就非常快了,对吧?就不只是OT了,到时候就整个就是log t的一个计算度长度的话就非常好。
另外的话用于这种呃encoder decoder架构。现在reco的话,它还只能用于deder架构。然后是对他的一些上下文的可解释性。可预测性和安全性啊,就是之前看到的那个可视化的一些东西。啊。
最后的话是经再引入一些高效微调的方法,使得再用很少的呃机器,或者说就很少的数据就可以高效的精调软客户模式。好的,这就是我今天给大家分享的内容。欢迎大家提问。
呃,好,我看到我已经看到一些问题了啊嗯。😊,第一个问题是为什么叫做RNN,而不是transformer的改进版。首先叫做RN是因为它确实有1个RN运行的模式。
大多数的transformer是没有这样的运行模式的啊。所以说我们把它叫做重新发明了RN。但它其实上也是transform的改进版啊,大家可以看到呃呃哎我的这个屏幕有问题。它的改进的路径非常明确啊。
这一页上面已经谈到了它的改进路径了,就是说它是从他是从attention free transformer这个上面来改进的。其实上它也是一种线性的注意力机制。他其实是从transformer发展过来的。
啊,所以说你也可以把它称作一种transformer吧。但是我们觉得它更有趣的卖点就在于它的RN运行模式,使得它可以高效的解码,这是其他所有传统的transformer做不到的。嗯。第二个问题。
channel mixing中的m指的是啥?啊,这里对吧?这个的话其实就是一个你可以理解为它就是一个。我之前说了嘛,就相当于一个卷积神经网络中的。的参数。一个参数是缪U,一个参数是一减缪U。那。
在这个地方的话,它其实就是一个对当前这个token和上一个token的一个线性叠加嘛,对吧?这个m的话其实就是一个参数,你可以把它呃就对,就是一个参数。第三个问题,raku对图像。怎么样?
Transformer。对,文本和图像都是so塔,文本模型扩展到多模态模型就很自然。呃,其实这里首先说因为reco是一个decodeder的模型啊,它现在。还没有迁移到一些。还没有迁移到一些图像上去。
所以说。还不能评价它图像上的效果怎么样啊。但是其实根据之前的一些观察,如果把racode改成双向的啊,它也完全是有可能可以做这个。呃,图像的他这个问题就在于。图像它没有那么长的序列啊啊。
你是否需要这样的一个东西呢?对吧?然后而且图像很多时候啊,我觉得解码有可能就是生成式图像。解码过程中也是基于上一步的话,那整个图像解码可能也可以加速。
但其实在我看来sdble diffusion这种方式也也比之前的已经快很多了。所以这个地方到底哪里有优势,其实不太好讲啊,但是我觉得。ku作为一个未来文本册的decodeder是非常有前景。
它还可以和其他trans进行融合嘛,对吧?就是说。把其他的已经有的图像的音频的一些呃特征提取器,例如VIT直接拿进来和它进行结合来使用,也是完全可以的嘛,对吧?
所以说我觉得呃这个还是得结合各种任务和各种模型自身的特点来看。第四个问题,AFT中的EKV是怎么理解的哟?这边的WKV能像交叉注意力一样,处理两个长度不同的。
序列吗?OK我来看一下。诶。AFT中的。EKV。嗯。他我觉得他理解的就是这一点吧,这个都像我说的。😡,K的话就是和自身词相关的一个。向量V的话就是它本身的值向量啊,这两个值都和纸开的自身相关。
不和其他token相关的。
然后WKV能向交叉注意量驱动驱呃处理两个不同长度的序列嘛。其实我觉得这是两个概念来呃。
我觉得有可能可以改进,但是现在的看的话,它其实还是只是处处理自己这个长度的序列上的一个信息。它不像pros attention那样的话,其实是两个序列的聚合。其实我觉得还是还是有点不一样。
啊,第五个问题,多轮对话之后,raku可以跟GBT1样回答我第一个问题是什么的能力吗?
嗯。呃,是可以啊,因为多轮对话之后reku因为他把每一次的对话之前的结果都存存到state里面去了,甚至有些办法可以优化这个state。例如说你第一和他第一第一个问题的state。
第二个问题state第三个问state对吧?通过良好的设计这个state那他可以把第一个问题state给你直接传进来呀。那么他自然就记得了这个之前的状态,一种还有种办法就是说那它取平均呀,对吧?
那你之前多轮对话中的信息也完全保留到你现在的这一轮多对话当中了呀。从这个角度来讲,那在多轮对话中reku优势还是蛮大的啊,因为它每次已经把你的那个对话压缩成一个state后续直接来使用。
而不像transformer一样的,要把之前所有的上下文再来重新算一遍。那他只要只要设计者在使用你的这个reco的时候,把你第一次问他问题的state。通过一些聚合的方法,聚合到最后ex个t里面。
传到raku模型里。那reku模型就能记得你对他说的第一个问题啊。而且计算效率还超高啊,对,计算效率没有变还超高。他还把之前的过去的你的问题都给他记住。这多好呀。
第六个问题,理论上怎么解释这个方法避免得了长序列遗忘的问题。
这个我想我之前已经解释过好多好多次了,我想也是一个重要的点吧,就是这种三种机制循环时间衰减和token shift。啊,然后我觉得很重要的就是时间衰减和token shift的这两点都非常重要。
这是之前STM没有的哦。这是STM没有的哟呃第一点LSTM没有哪里呢?没有这个WKV它没有这样一个指数移动平均的过程,把一开始所有的信息都给他加到这里面去了。
对TM说他忘了他就是忘了他没有这种加权过程的,他有没有说保持一个对最初始的这个你的第最初始的词或者一开始的词的这么一个ten在那里。但从这公式里面去可以看他是有atten的哦,客户是有ten的。
他在场他对第一个词都是有ten的,只是说这个ttion可能因为后面不断新加的信息,它的tion会逐渐变小。但是它一一直都是有tention的。如果这个模型一开始认为这个词超级重要,对吧?我说的。
那他可以通过这种chan的方式,直接把它拉到很高的层里面来。那很高里面层的这些参数其实就是存储的这个信息啦啊,这也是一种说它保持长程序列捕捉能力的种的的方式嘛,对吧?这个的话是时间衰减。
另外一个就tokenken就是我说的CNN的那个意思啊,就是说层数越多,那他CNN的感受也越来越大越来越大呀,对吧?那跌10千层就有10千0层的感受也了。那一就100个ken的感受也了。那像这样的话。
它不是也就保证了一种啊这个。呃,长城区的捕捉能力嘛,这两点都是STM没有的,我觉得这这是重要的创新点。
好,然后第七。推理越长,软库效率越高,效果如何呢?哦。这个怎么说呢?至少在这几个测试集的长度下。😊。
就是这个。这几个标准的这种语言模型测试几下reku在他们这个长度范围内效果和transformer基本上是一样的呀。再大一点的reku下更长的。例如说你专门设计了一个超长的。
比如说十0万字的这么一个对吧,它什么样的,那现在不清楚。那至少来说。在这些测试机上没有表现出比atransformer差的性能。
随着技术发展transformer是不是也可以支持CPU和小内存运行?
呃,我觉得是可以的,就是说但是说因为Ctrans本身的这种架构上的限制,使得他再想怎么压缩啊,他也没有办法达到racode。你可以理解为racode其实已经是一种极限了啊。
就是把所有之前的信息压缩到压缩到一个状态里面,这其实是一种极限了。我感觉没有办法说你不压缩任何状态就可以再做下去了。那传字母可能有很多种办法可以减少它需要呃需要拉回的上下文。
可以减少他需要的计算的这种呃量,对吧?例如说KVc这样的机制,大家都见到过。但就算如此啊,他在这种计算效能上还是没有办法和raku相比的。能不能放到CPU我觉得最大一个问题在于啊最在于。嗯。
对于大模型而言啊,我们就做一个简单的假设吧。因为大模型你假设有一个。
呃,是就按我之前说的那个,免得又不假设了。假设你在1个16GB的内存的CPU上,对吧?运行1个70亿参数的模型。简单来说。其实参数的本身就是其实。啊。7亿了嘛,然后他需要的内存,这就是7GB了。
然后你的序列越长,你中间还有一些中间结果嘛,这些也会产生大量的内存嘛。那他这个序列越长,那要存储这些中间结果的内存就需要的越多呀。对吧所以说。
所以说的话他其实上是。呃,需要的内存就会比软客户多,就是说就是按传统的这种标准的trans而言,它需要的内存就会多很多。那CPU上的话,除非你说很很大CPU的服务器来算,那其实上就。啊。
我觉得我觉得这这回答不太好啊,真正好的回答是说,你看每次它就进一个token,对吧?一个token跟整个模型参数算一遍,你就可以得到下一个 token了。
你所有的transformer你都得把之前的几十个上百个上千个token拿进来一起算对吧?那么你如果有100个 token。
那你是不是就得多算10个ken的计算量100个ken你就多算10个token计算量对吧?从这个角度讲,那transformer怎么都算的会比呀,那因为慢那CPU根本没有办法支持它的推理了,对吧?
哎我觉得这个回答更好。😊。
然后。微调7B需要多少显存呀?我这里跟你说了嘛,15G呀。在BF16上调15G就可以了。那这个现在的4080不就是15G了吗?对吧?4090也能调嘞。嗯。请问团队怎么看最新的mega bat这篇论文啊。
这篇论文我记得是印象中其实就是说拿1个CN去把各种bet给它组合到一起。
呃,这个想法其实宏博也是有的。彭博一直觉得之前现在的做法是每个be不知道他自己这个词的长度,对吧?因为每个be它只有8个字节,但其实对于中文来说,它可能是呃三个字节对吧?
或者两个字节或者4个字节那这个东西他就不知道后面他到底有什么了嘛。如果他能知道自身的长度的话,那可能学习起来更好啊,我觉得这个也是一种这个也是一种很好的方式。
但我觉得并不矛盾ra甚至可以之后把ga这个ide给他引进来是完全可以。
训练环境需要什么样的?像我说的,如果你只是微调的话,那30904090都可以的。请问对于短序列和较小的模型,raQ仍然有效吗?有效啊,序列越短,那它的遗万问题就更更轻了,更没有问题了。
只是说序列短的时候,可能相对于transform的优势就没那么大了,对吧?那么你在一些序列短的情况下,小模型的情况下,你可能用transformer还更容易一些,对吧?哦。十4、请问一下。
如何组织堆轮对话的训练数据?训练raco有官方资料吗?呃,这个官方资料的话,其实在那个charec里面也有。其实我们的微信群里面也有,有很多有这方面经验的人。我觉得你感兴趣的话。
我之后可以把微信群发一下,大家可以加微信群去微信群里面问大家其他人的一些学习资料问和训练资料,包括微调信微调资料等等。15、现在趋势不是不做太复杂的prompt吗?为什么这里还要做很重的prot适配啊。
第十5这个问题我其实之前也讲了,就因为更敏感嘛。因为对模型对pro更敏感,但其实我觉得这个敏感也是指啊你的一些任务可能比较复杂,你的就必须好好去调。但是对于一些标准化的任务,我们可以提供标准化的pro。
你拿去直接用就好了,那就不用调。其实pro也是一个探索的过程,一旦摸索出来一个好的,直接拿去用就行啊,彭博其实发过很多这种他摸索过的很好的prot,你拿去试就行了。这个其实我觉得对于个人而言。
使用起来的也没有太多上手的难度啊,甚至借鉴别人的经验就行了,也不需要自己呃摸索太久。训练用了多少张卡啊,这个东西的话就不方便透露了啊。
17、二次预训练和supervise fine two可以学会领域知识吗?当然可以啊,这个没有问题。可以,没有问题啊。18、中文语经它的效果能接近GPT3。5吗?呃,老版的可能有点有点差距。
因为老板主要是在拍这样一个数数据集上训的那个数据集的话呃中文少一问多,但是我们最近在做一个新的模型,叫做ra word,它就是一个多语言模型,里面加入了海量的中文数据,现在已经完成了40%的训练。
欢迎大家去试一下新的这个ra word,我们感觉它的训它的效果已经接近GP3。5了,还是蛮不错的。然后理论上长度可以扩展到100K,可以呀,理论上完全可以,只是说100K真实情况下会什么样子的。
我们觉得还需要再测试一下看看。但是理论上说,模型其实是可以扩展到100K的,它不像transformer有。固有的这种理论上的限制,是吧客户在理论上是没有限制的啊。
只是说实践中可能会有点限制而transform是理论上就有限制,那实践中更不可能实现。19、模型结构比transformer复杂。作者有没有想过简化结构?其实现在这个结构啊是作者们。很多年摸索出来的。
其实reku的get upub的那个文档上写写过它的V一版本,V2版本V3版本和之前的V4版本V一版本是最简单的。你可以去看看它的最简化结构啊。
但是我们现在觉得我们加的每一个东西其实都是经过实验论证的啊,简化的话效果一般都是会下降的。我觉得。
简化不合适啊,因为我觉得几种机制啊,就像我这里这里所说的几种机制。这几种其实其实都是很巧妙的。你去简化它的话,呃,一般都会掉点。所以说不如再往其他方向来想一想,如何改进rapku。
像之前说的那mega batt,我觉得是一个很好的新的视角,会会会可能是会有正向收益的。
80个问题。roco可用在computer vision上嘛,我之前回答了,就是现在它还只是个deder,但大多但是很多computer vision任务是encoder结构的。
当然也可以用在一些生成上,但生成上的还没有经过实验。如果感兴趣的话,你可以拿去试一试啊,去做这种我图像生成它效果怎么样。理论上来说,因为它这种RN结构也可以使它在图像生成的解码过程中啊变得比较快。
会比传统的那种transformer这种解码要快。21、目前开源的。RWNB有推荐的吗?啊,我觉得你可以先去试一试几个吧,一个是我之前说的最新的word,这个是在多语言上面训练过的啊。像这样的话。
你会发现它中文能力提升很多。另外一个就是raku的riveri是它是raku的呃聊天版本。如果你想用在一些多轮对话里面的话,那raku ribbon是更加推荐的。
然后用lara微调7B的模型显存需要多大?其实我觉得呃像我今天说的,这个你用BF16其实都只用这个十几G的显存。lara它就更小了。lara我自己都试过很小很小,你根本不用担心这些东西。
一般的GPU就是比较平民版的GPU都是可以加载进去的,都是可以都是可以微调的。23、基于现在的实验,是否可以说明GPTG样模型顶层transformer是稀疏的。我不知道你这稀数什么意思啊。
但是其实从attention的角度来讲,transform后面训到收敛基本都是稀数的。它每一层其实只关注几个头肯的。你可以理解为每一层它其实它就它是蛮稀疏的,很多它的attion都是零。他都是你。
这个都不是说用我们实验证明,之前很多已经paper里面证明过的这个事情。WKV可用于。网络可解释性研究吗?可以啊,我觉得就像我之前说给大家看到的这个因果追踪的方法来展示信息传递路径,就是一种很好的这个。
呃,展示模型科解是新的方法嘛。
可以讲一下reku的长短记忆吗?其实这个地方已经没有LTM那种长短记忆的概念了啊,因为他已经把一些重要的东西都换掉了。可以简单说一下呀。模型迭代历史嘛?V1到V4。看代码没理清。啊。
其实我觉得那个过程还是比较乱的,因为不断的试过各种各样的东西啊,这个东西也没有办法很好的理顺。但是核心点其实我已经在之前的PPT里面给你讲出来了。
其实就这几点啊,这这三个机制其实我觉得是很核心的点啊,包括。对,所以说主要先去看free attentiontranser那篇paper理解。
理解它这个里面的这个ttion是怎么算的那再理解我们怎么把这个W向量给换掉的啊,那你就可以基本上我觉得reku的东西就理解50%了。如果大家感兴趣的话,我可以后面再写一个代码版本啊。
代码版本可能就更能帮助你理解说怎么这个re的这个呃线性t是怎么计算的啊,那就可能你一看代码马上就懂了啊,我可以后面再出一个呃在B站上在我的B站上出一个视频,大家可以来可以来看吧。
可能可以更好更好的帮助你理解re。27可以使用深腾的atla进行。能训练和推理吗?可以呀,就是我们其实也有也有算同事吧。
正在和华为接触at last的话其实是可是现在正在正在做一些相关的工作来支持raku的学习啊,现在现在的raku是兼容排to,因为是方便训练。那其实也有很多模呃很多是脱离了排touch了啊,包括啊对。
包括一些纯扩大版本的已经是脱离。脱例派陶式,但是那些版本只能用于推理,还没有办法用于训练。呃,28lara加ra库训在有工作了吗?好像有了,我之前看到过,你们可以搜一下,我觉得应应该是已经有人做过了。
写那个未来工作的时候,其实已经是应该是也是上个月的事情了。所以说现在已经有人做掉了这个事情。14B的大模型大概什么时候发已经有了呀,就是你去hing face上看,已经发布了。
就是那个word版本就是14B的。呃,ra有说明文档吗?可以去哪里看。其实现在所有的文档就是github上的那个项目。其实我觉得后面如果有需要的话,还可以整理一个更加清简洁清洁的。文档吧。
要运行在我觉得这是两个问题吧。理论上当然可以啊,CPU可以运行CPU地方就可以运行reku的CPU版本。如果你的K8S上还挂了GPU,那就可以运行GPU版的嘛。😊。
如何评价white box transformer这个工作我不太了解,我就不评价了。嗯,好,那我回答完了。😊,呃,如果没有问题的话,那今天的直播就到这吧,谢谢大家,谢谢大家来参加这次直播。
希望你们希望这次直播能给大家带来一些收获吧,谢谢。😊。
喜欢记得点赞,投币收藏一键三连哦。😊。
上机器之星soer模型资源站查找最新soer算法实现代码预训列模型,定期还有社区福利放送哦。😊。
RWKV-6论文解读 - P1 - 霍华德vlog - BV1tz421z7bT
嗯,欢迎大家今天来参加咱们的raku6的论文解读。ra酷6这篇论文其实已经投出去很久很久了啊,这其实我印象中一两个月前就已经挂到 archiveive上了。
当时的话我们投的是这个新的一个会议叫做conferenceon a language model。投完之后,我们就把它整理成archive版本发出来了。那解读呢是今天才终于有时间来解读一下。呃。
欢迎大家来参加咱们的解读会。好,先介绍一下背景吧,因为不太确定来的这些呃朋友们是什么样的背景,可能对这个ra酷transformer的了解并不多。所以我先从一些更基础的方面来讲嗯。
其实raQ和transformer可以代表两类模型了,一类是RNN。ra酷是一种新型的RNN。然后另外一种的话就大家都听过的,transformer或者叫变形金刚啊。其实两类模型在之前都有各自的局限性。
RNN例如大家耳熟能详的LSTMGRU1类的模型,在训练长序列的时候,很容易出现梯度消失的问题。而且那时候的RN都是没有办法为并行化的,所以他们的训练效率非常低,他们的可拓展性也受到了很大的限制。
后来发展出了transformer。然后transformer呢一大优点是它可以运行训练。但是呢他的问题是它具有二次的复杂度,在长序列任务上计算成本和内存占用都非常多。啊,内存占用其实也是一大问题。
就是说如果你内存占用持续增加呢,在在推理过程中很容易就就out of memory了。就呃怎么说呢?就内内存就爆掉了,就没办法继续执行下去。而这方面软酷是很好的ra库是一个恒定的线性的呃。
不是线性的恒定的一个内存占用,使得它在运行过程中的可靠性要高得多好,呃。咱们再来看看右边这张图吧。我拿我我把这换成一个笔,看看大家能不能看得到嗯。一。荧光笔。圆珠笔。好,哎。
大家能看到我现在这个笔画了吧。呃,我们现在我们来看一下循环的传统的RNN传统的RN呢,它是每一步执行的时候都会先要呃处理上一步,每一步的结果要等待上一步的结果出来之后才能继续计算下去。啊。
这使得阿安没有办法并行化。相比呢,transformer可以一整句话一整句话的处理,所以说它就可以并行化IN的传统结构,可以用下面这张图来表示。啊,就是从可以从上往下来看。
当一个字一个词经过linea层之后呢,它必须在当层内的RNN不断的往前走,最后走到结尾,那么跑运行出来。嗯,好,那就回到了raQ6。ra酷6其实有几个核心贡献了。我这里只是简单的写了一下。
首先ra酷6这篇paper里其实是同时展示了raku5和ra酷6两个架构啊,因为我们架构迭代太快了。所以说一篇paper里面把我们两个之前的工作都放在里面了。
表酷五的核心贡献呢是把 matrix value state引入。嗯,这个的话后面我们会详细介绍raQ6呢是把这种我们称作dynamicna recurrence。
或者更直白一点叫做datadatadepend recurrence引入到模型里,使得raku模型的表达能力得到了巨大的提升。
同时呢我们展示了raku5和raku6在各种多模态任务上的性能效率和扩展能力。简单的从这个图可以看一下现有的一些架构和软扣的一些特点了。最早的是传统的LTM啊,像我说到的,它有。
OE的time和memory influence,但是它没有办法并行化。transformer可以并行化,但是它的。复杂度非常高啊,他训练过程中,包括推理过程中的复杂度非常高。
那其他的这几个linear transformer呢。嗯,首先最原始的那篇trans linear transformer,它的复杂度确实是和raku是一样的,但是它的效果比raku差很多啊。
这个可以从各种呃测试集的指标上来看出来。然后S3和S4两篇呢其实是基于一种叫做long long convolution的方法啊,长卷级的方法来做的。所以它的训练的时间复杂度是N log N。
它远没有线性的ON的raku和member和rednet更优。好,那咱们进一步。啊。呃,先来介绍一下软库的总体架构吧。raku是由四个字母组成的,叫做RWKV。其实这四个字母是用了很多心思来取的。
并不是随便取的。RWKV和QKV相对。贯穿了整个RWKV系列啊,贯穿了整个古Q系列。无论从456这几代来看,这个基本的思想其实从来都没有变过。怎么说呢?首先我们想象有一个信息,我们把它称作值value。
同时呢我们给这一个值value一个地址或者用。一个键来标记它,我们叫做key。QKV呢就是transformer使用的。一种存储或者叫记忆方式。啊,后面我们也会在这个方面再。啊,进一步谈一些。
那么transformer检索一个记忆的方式,是指是先使用corry和key进行匹配,找到最匹配的key,把那个它中的value取出来。是这样的一个思想,而racode的RWKV是另外一种思想。
他这个思想在在于说。我有兼职。我有剑,我有值。但是呢我并不使用一个corrry去对它整体进行计算,找到最相关的key,把它的value取出来。
而是说我把我整体的所有的这些key value先做一个dey啊dey也是ra库的核心思想之一。同时呢作一个对这个信息接受程度的衡量,就是receptance。dK是必须的,因为一个整个模型里它。
记忆的容量是不限的,你不diK一点点出来,你不把一些旧的记忆知识删掉,新的记忆和知识进不来。所以这就是wait是W的含义。那有了这个还有了这个知识之后,有了这个信息之后,我要不要接受他呢?这个也很重要。
也许它是一个垃圾信息,也许它这个时候它就是一个空格,或者它就是一些乱码。这种情况下,那我的模型完全不应该接收这样的信息呀。那我就需要用一个receptance来控制模型对这样信息的接收。
当然反过来说也会有很多高价值的信息,需要模型好好的记住它,那么也是通过一个比较大的receptance来使得这样的信息赋予足够高的权重进入到整个模型里面来。好,这个这种基本思想我就先介绍到这里。
我们看一下右边的视爪扣的一个。每一个block的一个。基本结构吧,每个raku block有两个部分组成。第一个部分是channel mixing。啊,我们叫做通道混合。
另外一个部分呢是time mixing,我们叫做时间混合。channel mixing呢和transformer和其他的一些大模型架构差异不大,都是主要是1个MLP层。
核心raku的核心贡献和核心的价值都在于这个time missing。好,我们可以看一下啊,这个。有两有一条虚线在这里,这条虚线呢是ra库5和raQ六的一个核心差异了啊。
ra库5和raQ6的参数是一样的。但是它们的核心差异在于他们的计算过程不同。酷六专门引入了这样一条虚线,使得。每次在计算WKV这个算子的时候,是依赖于当前收入的啊,这是非常重要的一个。呃。
设计和核心的理念吧。好,那我们下面再进一步细细的讲一下呃,这个架构里的各个部分。
6首先是所有raku进来的数据都会做一次token shift。token shift呢是将当前的token和前一个token做混合。啊,然后raQ5和raQ6采用了两种混合方式。
ra科5的方式呢就是简单的线性差值。这个线性差值呢可以公式里面看出来是由一个参数缪来决定的。这个参数me决定当前token和前一个token各占多少比例混合到模型的输入里面来。也许当前token很重要。
那么谬就是一,也许当前token不重要,那谬当前的谬孔就是0点。反过来,前一个token就是0。9或者0啊,就是就是0或者0。9。但这个做法。的一个问题在于说。
其实上我们的这个差值的参数应该是由我们输入来决定。那么它的效果是更好的,而不是仅仅是一个可训练的参数啊,这样可训练参数其实是一个静态。所以在ra库6里面呢。
我们提出了datadependent linear interpretation就是有数据依赖的线性差值。有数据依赖的线性差值,我们可以同时样看到m这个位置被替换成了一个laura。而lara里呢。
其实就是一个标准的lara了啊。然后这个缪呢变成缪嘛X。软酷六借鉴了rara技术。为每个参数引入了两个全新的矩阵,就是A和B。通过计算,Y撇等于Y加上。
tangent HXAB来动态的生成token shift的量和衰减率。啊,这个在计算成本有限的情况下,呃,就增加了很少的计算成本,但是很好的提高了模型的容量。还有一点啊,这是我我的我的感觉啊。
就是采用这个lara的设计,其实。可以更好的复用raku5训练的结果啊,因为我们的ra库6是在raku5上构建的。酷其实已经训练好了很好的这个。呃。差值的参数。
其实在这个差值的参数上进行一定的lura式的这种调整或者平移。就可以得到很好的效果,并不一定需要从头来训一个全新的。呃,这样的一个参数。所以这个地方用lara,我认为这个也是其中的一个点啊。
就是可以更好的复用之前的参数。
好,然后我们下一步来谈一谈ra酷一系列模型,time mixing核心公式的演进啊,我觉得这个也是整个ra酷系列最有价值的最干货的地方之一了吧。我们先来看一看ra库四是怎么做的。ra库四的mWKV都是。
都是一个向量,这个向量的维度是D大D,它的headets是一,就是说它是个单头的。好,那么第一步的时候,T这里是它的时间步啊,第一步的时候,我们会对。K0V0进行一个计算,算出它的KV来。
同时呢给他一个buus,这个地方的me就是个buus。我们认为就就是给当前token的一个重要性的增加吧,对吧?同时呢会把它现在的buus乘以K0进行一个规划。第二步。会加上。K0和V0之前的。
同时呢当前这一步的也会加上一个buus。等到第三步就会开始对K0和V0进行dK了。这个时候就像我之前说的,是为了把模型中的记忆空间给它留出来,把K0和V0的一些重要性,一些信息给它dK掉。
但同样的会进行一个规划。好,第四步我就不说了。一样的举动。只不过说呃相应的K0会再乘一个m,就是说它是一个exential decayK,它是一个指数衰减,就是说越远的信息我会dey的越多啊。
会多次呈W这个矩阵来dK它。哦。好,那我们现在来讲ra酷5。首先,ra酷的一个核心设计就在于。无论是缪缪虽然这里是向量,但是我们会对角化W也是向量会对角化KV。本身就是矩阵。
所以他们都拥有一个维度是64乘64啊,这个地方其实是它的headt size。就是指。ra酷5它会把模型的维度区分成很多的heads side。每个head size是64。
那这个地方如果我们的维度是512,headide size是64,那么就有8个头8头64维啊。但是每个头其实是变形算的。所以我们单独看一个头就可以了。第一步。第一步也是加一个m一个buus,然后。
把K0。转制和V0成到一起啊,这个的话其实就是所谓的value matrix value state。可以叫张量值或者叫举证值。通过这种方式。我们可以发现。模型原本的。容量或者说叫state的大小。
是D。到爪科5力呢就成了64乘64,其实它是要比一般的地要大,64乘64这个44096了嘛,对吧?其实通过这种方式使得模型的状态增大,通过增大状态。来提升模型的效果。第二步。
beyond加一个buness,要当前的保留。第三步加上dK,第四步DK加两次。好,所以说我这边总结下来,ra库的一个核心区别在于消除了归一画像,没有了分母,没有了ra库斯里的分母。
瓦库我引入了矩证值状态。使得它的维度呢从D变化成了到了D除以HH就是head size。这样的一个举阵,从一个向量。State。进化成了一个矩阵state。这是ra酷5的最核心贡献。通过这种方式。
巧妙的扩大了整个state的规模,使得模型有更好的记忆能力和者模型容量。好,我们再来看ra酷6,ra酷六又做了什么呢?你可以看到ra酷六的公式,其实和ra库5是一样的。它在递归方面。
它的核心贡献就在于DDLPDDLP这个地方在差值的时候,使得我们差值的。这个token shift是依赖于是依赖于我们当前的输入的。啊,是这里对,是这里。
然后我们的wa decayK因此也是依赖于我们的输入的。啊,之前的这个可以这么理解,这个W。都是一个静态的可训练的值。但到了ra酷6,每一步是一个全新的。依赖于当前输入的。
所以我们在下标上做了专门的区分,一个是软,一个是W1,一个是W2。而第二步呢是W1乘W2。这就使得ra库六是一个完全动态的递归形式。
所以我这里说raq6的核心贡献是引入了channel wide的衰减率WT。好,我们进一步来看一看吧。软后的安安视角。我们把raku写作这样的一个递归形式,就是。每1个新的WKT。状态等于。
前一步的状态加上当前的goness。和KV之间的一个。新的KV。然后对状态进行更新的话是。做一步dey加上当前的显言部的状态,再把当前的KV加上去。呃,在这里可能会更清晰一点啊。
就是它整个的RNN的se里面的一个过程。爪库和爪酷六的区别就在于这个虚线啊,爪酷六中有虚线,吧酷中没有虚线。然后另外一个曲性区别就在m这里。啊,ra酷5是。
data independentra酷6是data dependent。好,我们再来看一下代码吧。我觉得代码可能对大家更容易。更容易理解了。首先。我们在代码里呢加上了B可点H两个维度。
B的话是be size。H的话是number of head头诉啊。然后每个的话,这个是它对应的has size。对。B除H是ha size。然后W呢是这样的一个。呃,对于raku5来说。
它是因为它是这个和输入无关的嘛,所以它没有逼这个维度。ra库6是和输入有关的,它有B这个维度。mU这个buus呢,现在它还是和输入无关的一个状态。好,那么当我们的新的KV进来的时候。系。会对KV做一个。
举真程啊,你可以这么理解,然后先获得新的KV值。这个地方是个Y啊,对对,这个地方我要说的更明确点,这个地方是个Y,为什么使用Y?因为。呃,这可定扯的更多一点吧。从很多角度来说,呃。
raku的这个记忆通过外籍的方式来update他们之间的干扰是更少的。这个是从很久以前的像hoop field的一系列工作以及assoocasial associate associateciative memory network一系列的工作都有证明。
更往之前追溯的话,那个common filter啊,也也有相应的思想在里面,它就是用外籍来更新它的这个的话,是是干扰最少的,效果最好的。好,然后呢我们这先算出输出这个输出的话,其实就上面公式一样的啊。
WKV的state加上buus和KV的一个。即再乘上一个receptance来判断它的接受程度。同时呢要跟清当前这一步的WKV state了。呃。
WKV state也是说用这个 decayK乘上它前一步的state,再加上它当前的KV就好了。啊。这个的话可以给大家看一下它WKV state的一个形状是什么样的。
所以说WQV的形状呢是bech size乘上它的headd的数量,乘上它的head sizehead size是两个维度,它是一个矩阵形式的head size。
所以说呃我们叫做它mtrix value的 state。
好,下一步我们再来做一下计算成本的分析。ra酷5和raQ6的一个计算成本的分析,首先参数了,参数就举证乘法,加time mixing加ele norm加词表,它就变成这样的一个形式。
计算量infer的时候的计算量简单的认为是两位的参数量,加上6倍的WKV。训练时候的参数量简单的认为是3倍的forward,就3倍的inference的。Flos。酷6,他因为引入了一些新的。
他 mixix的参数,所以说它在这个地方的参数会比raku更大一些,其他部分都是一样的。下面这个表可以给大家一些直观的感受。
raku5 Raku6他们的state sizeparmeter和他们inferd flows和train floats大概是要什么样的一个数量级,大概是么什么样的一个规模。
我还想很讲很我还想讲一讲的地方是在这里就是。state大小ra酷5raQ6还raQ4以及transformer是什么样的一个情况。raQ5和raQ6都是66倍的DL这样一个状态大小。啊。
第一的话是模型的维度,L是层数。所以说所指模型维度的增加和层数增加,它的t大小也会增加,但它前面的长数是固定的。ra库斯的话,因为使用的是向量的一个state状态来存储信息。它只有5倍的DL。
我们再来看一看transformer是多少,transformer是2倍的DLT其是序列长度。就是说transform是它本身它内部状态大小是其是它的KVc了。
是和它输入的序列和它infer时候序列是相关的。我其实我们可以稍微估计一下C等于多少时候就等于rap库5和rapQ6的内部状态大小,也就是33。所以说其实上ra库6和raQ5的C大小。
仅仅相当于一个上下文长度有33。各KVc的transformer相比来说比transformer这个地方要小的多啊。因为你33个KVc的transformer很多时候都做不了什么任务。但是对于软酷来说。
他66个就已经够用了。从这个角度上来说,transformer它的状态的存储效率是很低的。酷用33个,它相应KVc的存储容量就已经在很多任务上效果都超过它了。但换句话说。
nake可是说transformer它是无损的对吧?raQ的话,它是一个不断的有损,或者说是不断的压缩过程中获得它全新的state。但这个必然你降无损的一个压缩,必然带来问题就是它的内存膨胀嘛。
你推理过程中,你的输入的越来越长,没有办法了。那你这个C的容量越来越大,那你最后就是降之说的那内存就爆掉了嘛。
我这里主要是想比较一下racode state和transformer大概是什么样的一个状态啊,其实只相当于33个KB开始。好,再和其他架构的这个。time missing对比一下。
其实这也大家最关心的了。因为在这个赛道上绝对不只是ra库这一个玩家嘛,其实和ra酷比瓦酷晚一点,或者说同期的一个工作,就是大家都知道的S4abber谷提出的S4模型。啊,SSM模型。状态空间模型。
他当时他的dey的 mechanism只是使用了一个静态的dey,所以它的阿尔法这个地方是一个不带任何T的。参数。可训练的这么一个st decay呃st decay它是一个静态的。
man巴呢是S4的进化版。满把可以认为就是dynamic的S4。它的核心贡献就在于把它的尔法从一个静态的转化为一个动态的,转化为依赖当前输入T这样的一个d机制了。retite是另外一个非常漂亮的工作。
但recknet它使用的是headwise的t decay。这个伽马这个地方上面带了一个波浪线,说明这个参数是不可训练的啊。这个参数是不可训练的,你去看过代码就知道了,它这个参数是人工设计的。
比如说10。8570。60。5、0。45、0。25、0。125是这样的一系列的人工设计出来的衰减参数。他用这样的人人工设计的静态的衰减参数来设计的模型。
这也是我们认为reckogni nice表现不够好的一个核心原因。然后member2呢,它其实又走回了lining attention的路线,它的表达形式也和recite非常像,但是他把。
伽马这个地方有。静态的headwise dynamic decay。变成了动态的。head wide dynamic decay啊。
它这个伽马这个地方是依赖于它的输入的这就是member二的一个核心改进跟贡献所在。然后就到ra库系列了,虽然ra库是我们对外宣称ra库5,但其实ra库内部有好多个小版本的迭代。
其中第一个小版本就是ra库5。1ra库5。1呢用了一个table的伽玛来定traable的head wide的 decayK的参数啊,这个是相比re light的一个进步,从它的纯静态的。
改变为一个trainable的。伽马,但是我我们认为下降还是不够好啊,因为你。只是把它改成trainable的,它还是没有数据依赖,它没有依赖输入。所以到了raku5。2又把它去改改变成了啊啊。
我说错了,这个逻辑有点错啊,我们认为headwise不如channel wise。所以我们把5。2改进到了channel wise的traable decay。等到ra库6。
我们又把channel wise的trainable decay改进成了chan wise dynamic decay啊。
ra酷6的chan wise dynamic decay是现阶段表达能力最高的设计啊,也是我们所有看到的模型里,我们认为是最优的一种设计。
好。再想发散一点啊,这里其实是我自己的一些想法。raku和transformer的核心差异到底在哪里?难道仅仅是一个叫做tention,一个叫做linear tension吗?或者说。仅仅是。
一个是二次的,一次是一个是线性的嘛,我觉得觉得不是本质了。本质的问题在于它是两种记忆模式之间的PKtransformer的记忆模式,我们叫做寻址记忆。addressing memory。
什么叫dressing memory的其统transformer记忆呃,它计算过程中就能看出来,它每一次是先通过query搜索词去寻找它的地址。找到对应的地址了,再把它对应的value拿出来。
是这样的一个过程,它就特别类似于计算机里工作的方式,就是寻址的过程。我们把它称作addressing memory。那它的优点是说呢,我进来的所有memory我都可以在后面不断的拼接,不断的拼接。
会变得无限大,对吧?我只要给他每一个。新来的valueue或者新来的信息都给他一个key,那我就可以无限的检索它,对吧?只要我的硬件系统能扛得住。
我可以给他100万、200万、1000万甚至一个亿的上下文都可以,我只要把它把它存下来就可以。ra库呢是联想记忆。什么叫做联想自?这个东西其实上。可能对于这个领域不熟悉的人的话,我稍微简单的介绍一下吧。
联养记忆认为是这样的,我有一个记忆进来。有个信息进来,例如说是V0。我给他一个KK0,我把它乘到一起,加到我们state里面来。例如这个零这个图像零,它就是一个信息。然后呢,我们每一步给它新加一个信息。
到KTVT的时候,比如说这个酒是当前这一步新加的信息。那我们所有的信息就都存在ST这个状态里面了。那我们这个信息怎么从ST这个状态里面?回忆出来呢其实用的这样一种机制。
我们对ST可以乘上1个K0T的转制。这个时候呢,因为K0T和K0反制之间的内积必然为0,所以V0的信息就可以检索回来。而其他部分的信息呢,我们都要保证它是正交的,证交这他们之间的内积就是零。
就所有其他项都消掉了。这是一个简单的实验呢,我们存进去9,我们可以用一个残缺的9,就可以把我们存储在内部的9的信息给它还原回来,或者给它检索回来。ra扣。其实他真正用的方式就是这样的联想机。
而并不是一个巡视记。那更深刻的问题就在于AGI背后真正的记忆之是什么呢?到底是寻址记忆还是联想记忆呢?不好说。但是对于人而言,肯定是联想记忆。因为人的记忆能力是有限的,是一个固定的大小。
没有谁有无限的记忆能力,可以记住无限的信息。这个是在人脑里面绝对做不到的。第二,人。的记忆其实是除了除了青青春期和青年时期是在增长之外,到了成年以及老年期,它都是在衰减的啊。
所以你更不能说你的记忆能力是在增长的了。对于人而言,记忆是越来越差的。如果得了一些病,像什么呃阿尔阿尔茨海默症什么的对吧?那记忆忘的更快,记忆速度晃的更快。
所以基本上学术界都认为联想记忆是大脑中真正的工作方式,因为他的这些特性是完全匹配的啊,更深一次更深一步的说的话,那个就和神经元结构的突出什么有关系,那就不在这个咱们这个呃直播里讲的。好。
这就是我自己的一些想法了,和大家分享一下。
有。好,我们继续介绍raku六论文的一其他的一些东西。比如说我们专门设计了一个全新的分词器,我们叫它word分词器。因为我们的目标是希望它能够兼容全世界更多的一些少数语言。
BPE的核心问题在于它都是在大多数的英文语料上训的。因为BPE是依靠高频把它们连在一起。那么在英文语调训出来中的BPE词表大多数都是英文的对英文的代表性确实很强,但是对其他的一些语言代表性却又很差了。
或者说就表现不佳,同时也会带来推理成本。所以我们手动筛选了多个分词器的词汇表把,它们融合在一起。词汇板大小为65536,然后给他每一个段设定了相应的这么一个呃含义吧,就是说。
然后rakuword的分词器呢是一个贪性的分词器,每次选择当前能匹配到最长的token来匹配。采用call tree前缀溯来优化它的编码速度,这个是ra库社区实现的一个rat的分词器。
可以看到它的性能是非常惊人的。优于优于openII的 token,也优于其他一些现在大家使用的tokenr的性能。所以从这个角度讲,raku的这个分词器,绝对不会被性能方面的问题卡住的。好。
那再介绍一下阮库。6论文中我们使用的数据集吧啊,我们使用了这么多种数据的来源,总共是1。12T的tokens的多语言数据集,70%为英语,55%为多语言,15%为代码,没有进行任何的上采样和下采样。
保持了数据的原样进行学习。
好,然后是一些语言模型的基准测试。首先是多语言任务上。rap酷6表现出了很好的效果。啊,基本上。在多语言上的平均分都是最高的,也超过了其他同规模的模型。然后英语上面呢,因为。诶。之前说到的。
我们兼顾了其他一些语言,所以说它的表现呢也是名列前茅。虽然在有一些场景下,可能是minial7B呀,或者member1。4B稍微好,效果好一些,但是同样是能力名列前茅。
这就是准确率和lope之间的一个对比了,左上角是最佳位置。可以看到越往左上角越好。啊,在多语言上,我们可以发现最好的其实就基本上是ra酷的两个模型。
然后英语中的话表现最好的是在左上角应该是这个BDLM3B。
好,再来谈一谈关联记忆的测评。这个关联记忆话其实是和之前的我说的联想机忆是很接近的一个东西。其实它是用来设计的一个合成任务来衡量。新型架构随着炫涡序列延长,他能否回忆出他从其中的信息?他其中有两个任务。
一个是叫做associative recall。比如说我给他一系列信息,我以key value的方式排列。P在前value在后。那么我当我问他。A这个key的value是多少的时候。
看他能不能准确预测出三啊,如果能预测出三,那么说明他答对了,他成功的recod这个信息了。mti query associate recall能是指我一次不只问他一个corry了,我增大它的难度。
我可以问他A是什么,A的value是什么?C的value是什么?D的value是什么,看他能不能同一个长序的这种一次性的把所有的信息给它回忆回来。
在这个任务上的ra库展现了极高的准确率。首先我们来看。64的sequence长度的时候,其实对大家这个模型来说都没什么难度了。等到128的时候,就有些模型呃,就ra酷4就表现的不是那么好了。
但是呢软酷五和软酷六依然都还在上面。还还是百分之百的准确率。等到256的时候呢。呃,又有其他的一些模型掉队了,其实还主要是pinina和软酷4。等到512的时候,你会发现只有ra扣6。
依然在64的维度上依能保持非常高的准确率。而其他的模型呢,在这个维度下,他们准确率都已经下降了。超越了3000的所有已知的其他非transformer的价格。
好,然后是这个上行上下文的一个实验。在PG19上,我们对软库456进行了它序列和损失的一个。测试训练长度都是4096,但是我们会发现,对于ra酷而言,ra酷5和ra酷6而言,它超过4096。
当它达到1万左右的。情况时,他依然能够保持很低的los。啊,软库4的话,这个时候它的los就已经升上去。如果熟悉transformer会发现的话,transformer如果没有特殊的设计。
到4096就已经飞上去了,到4096就已经飞上去了啊,它的软transformer的外推能力一直都是一个问题吧。但现在后面有一系列的改进了。但是对于软酷而言,天生的能力,天生的长向下文的能力就是很好的。
完全不需要特殊其他的改进和设计。
好,然后是速度内存性能的评估。哦。对。这里我们测试的批量大小都是8,维度都是4096。flash attention和rle6的head side都是64。我们可以看到。其实。
从memory的 usage来讲啊,ra酷6一直都是最低的。而且随着序列增长,它这个低的程度会越来越明显。而flash attention虽然它已经是非常优秀的一个工作了,但在超长的序列上时。
它memory usage。还是会快速提高。另外一个是inference time。inference time的话呃。
flash attention其实基本保持了attention的一个2次2次性的关系了。然后raco的话是一个线性关系。依旧是一个线性关系。随着序列增强,它依旧是线性的增加它的推理时间。
然后是多模态的一些结果,以及其他任务上的一些结果了。这是raQ5在音乐数据集上的一个效果。相比软库斯,他约谱部分的损失降低了2%左右。在泛化和建模能力方面都有增强。
然后是软核5的视觉模型。呃,用clip做视觉编码器,软后做LM。老控我这里我专门强调一下它的。他的他用的是data independentdepend recurrence。
然后同时它的图片呢是放在最前面的,同时它只使用了单向扫描。所以它的效果一般般啦,就是说和其他一些模型比还不错。但是和索塔比的话还是会有一点差距。所以我在这个地方我们就升级到了ra酷6。
然后六对。VUra库进行了大量的改进来,使得它的效果真正的得到了快速的提升,同时可以和当前的transformer的最优的lava呃掰一掰手腕了。这个地方的话,在4个数据集上都超越了lava。
特别是在中文数据集上比lava好很多,这也得于ra库是多语言模型的这个特性。那在其他的一些学术数据集上,如今QQMMB。呃,都同样优于。同样优于呃lava啊,当然这里是挑了几个比lava好的啊。
还有些测数数据上不比lava强。啊,但是至少在有些方面能比拉拉强,就就已经能够说明很多问题了。同时,ra酷Vra酷同样表现又保持了它它的很好的内存呃很好的推理时间,它线性的推理时。
时间像这个等到2万多的长上下文长度的时候,已经比lava要快4倍了。很好的GPU memory的 consumption。同样是这个GB的模型,等到2万多的时候,可以节省54%的内存效率啊。
这个东西就是说我明我们依旧保持住了re软酷的这个在效率方面的优势。然后效果方面呢在快速追追赶上transformer。好,那我们再进行进一步讲一讲这个VU点Q6到底做了哪些东西吧。
首先是 sandwichwich fruit。我们发现对于raku这的模型而言啊,就是说。你仅仅把图片放在前面是不太好,不太够的。因为我们需要说让模型先知道我大概要提取哪些信息,然后再来提取做任务。
会的效果会好很多啊。这个地方我没有放玻璃实验来,可以到论文里面去看玻璃实验。玻璃实验的提升也是很明显的,用了s的时候, sandwichmch意思就是说把图片像三明治一样的夹在中间,两边是两片面包。
这面包就是它的文本啊,像这样的话可以提升它的。哎,怎么跳出来了?像这样的话,就是呃使可可以提升模型的效果。另外第二点呢是这个双向的。扫描。因为对于文本而言,它是单向扫描,但对于图片而言。
你单向的信息其实是不充足的。例如说单向信息,它总是从左向右扫。那么右边的信息其实知道左边右边的头ken是知道左边的信息的。但左边的头肯是不知道右边的信息的。那么例如说我就问这个鸟。
这个这个地方都是没有这个东西。例如说在路上或者什么,你就问这个左边的车的右边是什么东西。那么这个时候模型往往会遇到一些问题,就是说因为我左边的车我都没有看到右边的东西呀,那我怎么知道右边是什么呢?
所以说要使用一个双向扫描或者多向扫描或者其他的一些扫描的方式,这个地方我觉得有很多可以改变的空间了,来帮助模型提取它四面八方的信息。然后再交给单向的ra库去进行生成。像这样的话可以提升它的效果。好。
所以说这个地方就加了双向和三位之后呢,其实有了很大提升。特别是SQA上提升了接近10个点啊,然后另外一个很大提升其实就是ra库6的datadepend recurrence。
这个地方提升也是非常巨大的VQA提升了将近15个点啊。呃,其实从raQ5和raQ6paper里面来看,效果是没有那么惊艳能爆炸的。但是当它迁移到多模态上来看,你会发现raQ6的提升简直就是毁天灭地级的。
就是说我我做AI这么久,都从来没有看到过一个改进,可以提十多个点,这么爆炸的这么一个东西。所以说我觉得raQ6这个工作其实确确实是非常漂亮,真的是解决了一些核心问题。好,这里又吹过了。
我们继续呃继续往后走。呃,还做了racode在audio上的一个实验。raq audioio就像我说的,它引入了四项位移技术,但它因为它不和racode的LM强耦合。
所以它这个地方其实是相对容易做一些的。他能够更好的捕捉二维拼铺中的临近关系。Okay。
还有一个呢是rale clip,这也是最近出来的一个效果,呃出来一个paper。没有想到的是raku再把transformer替换掉,然后来做对比学习,也表现出了非常好的效果。同时使用raku的话。
就是et同时使用raku效果特别好啊,可以看到这里比同比你错配的使用效果更好。然后在他的这个VU可视化的过程中会发现。raku clip它和它的test image之间产生了某种奇妙的联系。
他们之间被奇妙的对齐了。这个事情其实现在还不知道什么机制,但确实是很有趣的一个现象。呃,感兴趣的朋友们可以去深入的研究一下。而在transformer和非对称的这种结构中。
其实他们之间的分离度是很大的啊,这个东西其实就我不觉得是一个很很神奇的事情呢。好,然后还有人把软库用到了点云数据上,也取得了很不错的效果。
RWKV:在Transformer时代重塑RNN - P1 - 霍华德vlog - BV1b8411Z7Df
呃,欢迎各位观众今天来参加我们的直播。我受这个彭博的委托来给大家讲一讲我们的paper Raku。啊,对,这个的话标准的发音叫raco,不只是不是不是这个RWKV。嗯。
OK好,那咱们今天的直播就开始吧。首先先讲一讲核心卖点吧,毕竟大家的时间都很珍贵。嗯。让你先看看我们的核心卖点,让你觉得值不值得把这个整个直播看完。首先runku的核心卖点是OE的推理复杂度是真的很香。
首先,单token的推理时间是恒定的,总的推理时间随序列长度线性增加,而传统的transformer呢是随序列长度二次增加啊,甚至有可能三次增加。在特别长的序列情况下。内存占用恒定,不随序列长度增加。
第三点呢是推理时间。和内存占用。呃,都是随随尺模型的尺寸线性增长。大家可以看这两个图啊,就是为了表表达这个推理时间。和内存占用其实。都是随模型尺度线性增长的。
可以看到其他的transformerQ就飞起来了,这个是它的啊内存的使用。这个呢是它的推理时间,也是Q就飞起来的啊。我们可以观察到数量级别的优势。在这个方面的话,所以说这也就意味着。大模型的硬件限制。
和部署成本所有如果使用raku模型的话,可以大幅的降低。我们已经在CPU和非NV的加速卡上部署raku模型。这个的话就不再受美国卡脖子的限制了。你买不到英伟达的显卡也没有关系。
用你的CPU就可以跑大模型。然后呢,是服务器上的大模型部署成本可以大幅下降。普通的台式机和笔记本的算例。内存就已经足够部署一个本地的大模型。手机端将来也成为可能啊,手机端现在的主主要问题是内存还太小。
如果手机芯片厂商进一步跟进,例如说加入一些PF16的尺寸的啊这种这种数据格式。那么未来也有可能手机端可以部署啊,但我我是比较乐观的,我觉得可能。一年甚至两年啊,就可以部署这个在手机端部署大模型了。
所以说不夸张的说,我们觉得raku将推动大模型进行一次。架构迁移,从现有的transformer架构迁移向reku这一类的线性transformer,或者叫做线性attention的模型。
OK那你看香不香啊,如果觉得足够香,那就跟着我继续往后。看我的直播吧。OK那么就回到这个一开始先介绍一下。RNN和transformer各自的局限性。
首先这个RNN吧它训练长试液的时候容容易出现梯度消失的问题。所以前十0年20年都提出过一系列的工作,如GRU如LSTM。就是来解决这个长序列梯度消失的问题,但解决其实也不是很好。
LSTM差不多在100个token或者说100个字之后,它的。梯度就停止下降,说明他已经开始遗忘过去的信息了。另外一个问题呢。是安安在训练过程中无法进行并情化。他也是必须每一步一步的进行训练。
限制了其可扩展性。这就是为什么之前的RI模型都没有办法训练的很大。就因为他没有办法并行,就使得他有就算力用不上吧,可以这么说,所以之前都没有得到过很大的RN模型。
然后transformer的问题呢是传统的transformer或者说标准的transformer,它的tension是具有二次复杂度的。在长序列任务中呢,计算成本高,占用的内存多。我们可以看一下。
右边这张图表啊,transformer在时间上它的复杂度是T方。空间上的复杂度也是提方。啊,T方站主导的T的话就是序列长度。Araku。时间上是。OT的复杂度,而空间上是OD的复杂度。
D的话在这里是一个常数,就只是它隐层的向量大呃隐层的这个维度,也可以简单说,它就是O一的复杂度。啊,所以说。本文呢主要是提出了raro架构,它结合了IN和transformer的优点。
同时缓解了他们已知的限制。好,我们提出一种线性的线性注意力机制。最后呢我们展示了raco在。大模型长距离依赖关系任务中的性能效率和它的可扩展性。OK来讲一讲RNN它最简单的形式是什么样的呢?
它最简单的形式其实就是XT是它的输入。HT呢是它的影像量。然后呢,每一步我们会有一个遗忘门,决定这一步我们把多少信息放多少输入信息和多少上一步的影像量信息放到这一步的影像量信息当中。啊。
可以看左边这个图啊,右边这个图就是这样的一个意思。所以说RN它是一步一步执行的。嗯,每次只能处理一个字或者一个词。如果你分词的话。它的内存占用很小,它计算量也很小。因为它每次值处理一部的数据。
但是呢因为他对前一项是有很强的依赖的,这里指的话就是HTI。啊,H确是这个HT减一是它的所谓的前部,是它很依赖的。所以说使得它没有办法并行化训练,这极大的限制了RN的可扩展性。
相比较transformer呢它一次性是可以处理一整句话或者处理一整段话的,所以说是可以并行训练的。OK那我们下面再讲一讲transtransformer的attention啊。
和我们从transformer attention中受到的启发,然后提出了我们新的attention机制。哦,这里的话是传统的tention,然后对它进行了一点改写,改它改写成向量版。你可以这么理解。
就是对于某一个T当前啊这T就是当前的token或者字或者词。我们使用它的呃cory。和他的key和和不是和他的和他所有的key和这个序列里面所有的Tkey计算一个分数。然后这个分数呢再对。
它的直向量进行加权求和。那么我们就可以得到。这个T它的一个向量了啊。啊,下面这个呢是一个规划像,也是把所有的它的。现啊所有他的这个叫做啊注意力的分数给它加到一起。大家要需要理解的话。
可以看一下左边这张啊,右边这张这个图。然后AFT呢是指。attention free transformer是21年苹果的一篇论文。他在这个里面呢,它把QT乘以KI。改成了WTI加上KI这样的一个格式。
这个格式的特点在哪里呢?嗯,这么说吧,我先换支笔。这个WTI它是一个矩证。然后呢,是T乘T的矩阵,就是说它是序列和序列之间的矩阵,它代表的含义呢是一个位置的token对另外一个位置的位置偏置呃。
positional bias。它是一个固定矩阵,就是说它对于所有的词,所有的所有的序列而言,它都是固定的。啊,那这个的话就很不好了,这太静态了,没有没有办法学习到很多的知识。所以呢。
作者又使用了1个KI,这个是和每个token强相关的1个KI。用这个值来调制它的这个啊positionpositional bias可以可以把它调的高一点,或者把可以把它调的低一点。
通过这种方式呢形成了一种线性的attension。然后很受这个想法的启发吧,就是说哎那就可以摆脱了这个Q乘以K的乘法,对吧?那也就摆脱了,不再需要依赖之前整个序列里面所有其他值的这个限制。
所以呢raku就提出了一个channel wise的时间衰减向量,就是这个W。呃,这里先解释一下channel吧。
因为这个channel和可能大家在其他配per里面看到channel和CN的channel是不一样的。这里的channel其实就是。就是隐藏隐藏层的维度就是。D啊它就是一个W,就是一个D位的向量。
每一个其中的一个值,我们称之为一个channel。啊,你。OK好。那么这个公式的含义是什么呢?就是说比如说我们有128个channel。
然后它前一个向量就是-1W前两个向量就是-2W前三个向量就是-3W,它都是跟自己的位置和它之前的token的位置有这么一个关系。因为它是在一当中的,它又是个负值。所以他其实就是一个时间衰减向来。
你可以简单简单的理解为。距离当前token越远的token,它就会衰减的越多,越近的token,它就会衰减的越少啊,但实际情况下比这个还要复杂一点。
后面我们有个图来可视化这一部分channel的信息衰减。好,这个其实就是reco的一个核心思想。我们下面来完整的介绍一下reco的架构吧。首先,raku里面的RWKV分别是4个字母。的含义组成的啊。
这四个字母呢是R代表一个过去信息接受程度的向量。W就是刚才说的时间衰减向量。K是间值向量。就是之前说的用每一个token自身的一个值来对位置向量进行调制啊这么样一个向量。V呢是每个token的值向量啊。
它也类似于传统注意力机制中的V。然后我们来观察一下一个embedding进入reku之后会经过什么样的一个东西呢?首先它会进入time mixing模块,在time mixing模块里。
它会和它之前的所有的文本信息进行一次融合,所以叫time mixing,它会把过去的历史信息加到自己的身上来。然后呢,经过一个lay norm就进入到channel mixing。
channel mixing设计的目的呢是因为time mixing,它其实并没有考虑到每一个词,它每一个维度之间的这么一个非线性啊,所以在这个模块里面呢。
会对每一个词的它本身的channel进行一个强烈的混合和非线性,增强它的非线性能力。使得模型的学习能力更强。好,那我们来讲一讲这个time mixing到底是什么样一个含义吧。嗯。先来看公式吧。
这个time mixing里面你会发现就是之前讲的那个W向量,它是有两部分组成,一部分呢是之前的所有的。呃。这种时间衰减的向量乘上它之前的token的。直件向量和它的直向量进行聚合得到的这么一个东西。
然后加上当前token。的一个。呃,权重对吧?这是权重和它的一个值向量。那U呢是单独设计的一个专门为当前token的而设计的一个。取证吧啊,这样这样的话,可以把和之前的向量区分开来。很更大的一个问题。
根据之前的公式,你会发现,如果T减T到就变成零了,对吧?那你不可能用零乘自己的这个限值啊,加自己的键值嘛,那不就没有学到东西了嘛?所以说必须换一个向啊换一个向量来表示它。😊,下面你层依然是个规化函数。
我们可以用这个。右边的图来解释一下它具体是什么样的一个过程。呃,首先对于第一个偷token进来的时候呢,你会发现它会和EW这个向量里面的这一列产生作用相乘,得到一个新的Ebedding。
当我们往前走一步。你会发现它是这当前第二向量和它前面的向量呢,会和它的时间衰减的这个举阵啊做一个就是点对点的乘法吧。然后以后以后以后又是形成一个新的项链啊,第三步和第四步都是一样的。啊,同时你会发现。
因为时间衰减向量,你可以看到当前token它的这个向量的强度一般是最大的啊,然后呢它会逐步的减小,颜色逐步的变浅。也就说明这个时间过去的信息在当前这个token这里看的话啊。
它的信息的重要性在逐步的降低。通过这样一个方式呢,我们就实现了一种新的线性复杂度,就是这个。WKV啊就表示一种新的线性复杂度。这个新的线性复杂度,我觉得重要的意义在于。
它其实上用一种接近EMA就是exsponential moving average,就是指数平滑啊移动平均的方式,把过去的信息都加到当前的token里面来。啊,这其实是一种序列建模的方式。
我们觉得这个方式其实非常好。另外一个点很重要的话,我想提一下,就是你会发现哎这一部分。😊,和这一部分。都是过去可以提前算好的。把之前的信息算好了,传进来放到一个state里面。
就可以直接和新的两项相加一下,就可以算出新的WKV啦啊。这个的话其实就是raku可以RN模式运行的基础。后面我们会更详细的讲一讲一下这个东西。好,当。一个token经过了time mixing之后呢。
他又会来。进入到channel mixing的模块啊。像我说的channel mixing,它主要是为了给这个token它的channel之间加逞强的非线性。所以呢这里使用了。
这个叫square loop,就是说啊这么是一个很强的非线性函数,一个sigoid的函数,也是个非常的强的非线性函数啊。😊,就可以对这个每个token它的 channel进行一个mixing。好。
那后这一篇页PPT的还有一大目的呢是要讲一下这里。WT和啊不是WTXT和XT减1,这个就是论文里面提到的token shift操作,就是token的平移。我们会把每一个当前输入和上一步的输入一起加到。
一起加到它mixing module和这个channel mixing module里面来啊,像这样的话,其实也会很多种理解的角度啦。一个角度就是说强行做了一个by ground。
这个是一种NLP的角度,认为说我强行的把所有的字组成一个词啊,组成一个只有两个字的词啊,这是强行的bground这是一种理解方式。还有一种理解方式呢,其实可以把这个理解为一种CNN的过程。嗯。
在这个CNN里面呢,它相当于是一个窗口为2。一个参数为UR,一个参数为一减UR的。卷积神经网络。啊,从这个角度来看呢,你会发现。随着整个信息在向上传导,整个模型叠加的模块越来越多。整个模型在这个地方。
它的感受也是越来越大的。我可以简单画一个图,你们可以感受一下啊。首先对于第一个token而言,他能看到token就只有他自己。对于第二个token而言啊。
他其实他可以看到的东西是他自己同时他可以通过这条通道这个token shift通道看到他前一个token,对吧?那么他其实现在的感受也就是2。对于第三个头盔,这里可能不太准确啊。
他可以通过自己的 channel能看到自己。通过这个 channel呢看到上一个token。再通过这个channel能看到上上一个tken,这个时候它的感受也就是3。如果这个模型可以堆叠100层。
那么我们可以说这个模型在最高一层的时候,至少它会有100的感受。就是说它可以直接看到100个位置以前的token啊,这个在我们看来,这是很强大的一个序列建模能力。通过这种token shift的方式。
使得模型具得具有了非常巨大的感受。那某种角度说,如果你能把它对到1000对吧?那它其实就相当于可以直接建模1024,或者直接建模1000长度的上下文了。
所以说这个token shift在我们看来也是这个模型设计中一个很很很很不错的点吧啊。好。下面来说一下。模型因为这样的设计,它就可以高度并行化啊,因为你可以发现这样所有的这些值它都是可以提前算好的啊。
都是可以通过矩证计算的。它脱离了对上一个状态的依赖。然后呢,WKV使用一个串新的扫描,就可以把它计算出来。这就使得它可以像其他的transformer一样的并行训练。
一自把整一句话放进去就可以计算它的lo。像样这样的话,就使得它的可扩展性和transformer是一样的。好,下面来讲一讲它是怎么像RN1样解码的。我之前留了一个线索吧,对吧?
我说这个项呢其实可以等于它之前的项,加上它现在的项相加。你每次只要把它之前的这一项和这一项当做个state传进来,对吧?那它就可以马上计算这个状态下的WKV了,所以简化之后呢,使得整个模型。
就变成这个样子,1个IN的形式。我只需要把当前的token和它的state一起传进去,会返回一个新的state。要下一步,再依据这个新的state再去计算。每次我只依赖上一个状态。
state和当前的token,我就可以快速的对模型进行解码,这就使得模型摆脱了它之前的上下文啊,使得它每次只依赖前一步的state,极大的提高了它的计算效率,降低了它的内存消耗。好。
让我们来看一些关键的结果吧。嗯,首先reco通过三种机制。循环时间衰减和tokenshift来捕捉序列传播中的信息。循环我觉得这个呃这个我觉得这有点不好讲啊,这些是常识。
就是它每一步其实都依靠前一步输入进去这样的一个循环自段过程,本身就是一个序列建模的方式。时间衰减之前说了是通过这种channel之间的时间衰减的这个量来捕捉之前过去的信息。
然后tokenship刚才也说了,是相当于一种CN的窗口。当模型堆的足够高,它的感受也就非常大。那我们可以看一下,这个是之前LTM的一个呃pro token loss,就是说在。
就是说计算这个loss在100位置的时候,就会发现它已经饱和了,基本上就没法下降了,说明STM把它100个to困之前的信息都给忘掉。他没有这个长序列捕捉的能力,但rakuve可以做到多少呢?
至少现在可以证明他可以做到。4096的长度啊,在4096的实线上,我们发现它的los还在下降,它并没有体现出任何平台性,说明它的长程序列捕捉能力是非常强的啊,至少在4096的上下文下。
它依旧可以捕捉到之前的信息。好,然后来看两个可视化的结果。嗯,这个是之前留说过的,就是他对于每个channel之间的信息是怎么传递的啊,它表现出来是什么样子。我们可以看一下,就是这个其实很有趣啊。
第一层第一层第一层的话,你可以看到它在后面这些channel的时候啊,这个总共是有74七84维啊,所以说它的这里划到是接近800。你可以看到它后面一些圈nel,它基本就衰减为0了。
意思就是说是这些channel我根本就不关注之前的信息,我只关注当前信息,我不去捕捉之前的信息,我只关注好当前的token是什么样子的。但是随着模型层数的上升,你会发现高层的channon第12层。
它已经有很长的一个平台了。这说明什么?这说明在第12层的时候,它是一个全局的视角,它会从全局来看这个信息,它会保留之前的信息非常长的时间啊,它的都不衰减,它的这个它的这个time bK都接近一。
然后最后这这就是使得它具有了一个很好的长啊这种长城信息捕捉的能力。OK另外的话我们来看一下。使用因果追踪方法来展示这个信息的传递路径。
这里呢输入了是the ever tower is located in Paris。我们预测paris过程中,这个模型的信息是如何传递的呢?首先你会发现。当模型进入到第四个位置,第四个token。
这是这时候af这个词已经完结束了。模型就会通过一条路径把它传递到。20层21层这样的位置。然后在这个地方储存着这个重要信息。当模型继续往前的时候,这个信息呢也在不断的被向向前传递向前传递向前传递。
而且你可以发现它有两条路径在向前传递。当最后我们要预测它的时候,它就被传递到最后一个位置,告诉我们说。因为埃尔铁塔在paris,他们两个有高度的相关性嘛,他就可以正确的预测出parris。
这个可视化也是很有趣的。他展示了说R客模型到底是如何处理,在它其中的信息的。其实。他在看到efer的时候,他就已经猜到了,可能后面这个信息很重要,要把它用到哦,然后就把它放到了比较高层的一个位置。
储备着啊,如果你之后真的是要问他和艾er相关的信息,那他马上就会把这个储备信息拿出来。然后把它用于预测,帮助你得到正确的答案。一。好。下一页是一些evaluation,这这一页也非常重要啊。
因为之前声称做transformer线性化的工作非常多啊,但是其实他们都没有办法接近一个真正transformer标准transformer的效果,所以大多数人都没有跟进啊,因为他们的性能损失太多了。
虽然你各种效率上有很大的优势,但你性能损失这么大的话,就没有办法用。但这个评估过程中,你大家可以发现,在多个数据集上。把酷5的效果都是非常好的。甚至超过了一些同参数的OBT呀。
bom呀这样一些基于transformer架构的大语言模型。好。哎,还但于这里我还想分享一点,就是说其实在我们看整个结果的过程中,我们发现其实raku模型它当它的这个。参数量不是很大的时候。
其实是有一些劣势的啊,例如说。这个时候这个这这个嗯朗姆da这一个测试集,这个测试集非常有意思,它是一个能够证明你模型序列捕捉能力很强的测试集。因为它相当于它每次只要求你测试它最后一个字是不是正确。
一开始的时候在模型参数较小的时候,其实它和transformer之间还是有一些差距的啊,因为transformer它因为可以保存过去所有的信息。每一次去请求,他都可以把过去所有信息拉出来重算一遍。
就使得他在模型参数小的其实优势很大。把Q模型这个时候略趋于劣势。但是当模型参数上升到7亿,我们看到的是差不多7,不是7亿7B70亿参数的时候,就已经开始接近transformer的效果了。
等到14笔就是140亿参数的时候,集和银和transformer效果不相上下了。啊,说明其实对raku模型而言,scaling它获得的收益更大。他sing获得收益大于transformer。
我们分析的原因是这样的,transformer架构是非常强大,是非常通用啊。但是呢它对于很多任务来,他这么强大的模型效果,可能用没有办法完全发挥出来。嗯,而recqui呢它虽然有一些局限性。
但是呢当它的模型参数逐步增大之后,它的模这些局限性就被克服了,使得它在足够大参数的情况下,效果可以快速提升,然后就接近transformer的效果。所以说其实raQ真的是一个大语言模型时代的产物啊。
因为对于他而言,如果所有的模型都停留在berrt级别,那么它可能就没有那么有价值。但它真的到大语言模型时代。比如说模型参数70比7B14比甚至更大。在这种情况下,它的优势就体现出来了。好。
然后是核心卖点了,就是推理复杂度,生成长度为T的序列transformer需要T方的这么一个复杂度。所以说真实在真实的测试下,它也是受它整个这个需要的时间就起飞了reco它是一个线性增长的啊。
所以说对于特别长的文本生成。那么reccove在推理效率上就有很大的优势。然后是一些我们在呃。非GPU架构上的结果,例如说在CPU上,raku可以使用int8模式。in特8模式的话。
它的los损失非常小。延迟很低啊,同时模型参数也不大。它就可以快速运行,而且可以编译出各种各样的ESE支持的平台,包括。inux呀、windows andmac arm都可以支持。然后呢。
是也有了主要库,也展现出大模型在端侧匹配的潜力。简单说就是说。CPU上16G内存就可以运行70亿参数的模型了。然后12B的话可以运行int8的71毛钱。在英特尔BF16的芯片上的话,它的速度可以更快。
然后在GPU上,15GB的显存可以运行71参数的模型。9GB的显存可以运行。可以运行int8701参数的模型。那这个就是真的是入门款的GPU就很多都可以支持支持大模型的推理了和和啊对。
所以说这也展现出raku在端侧良好的潜力。如果之后模型再进一步做一些小型化。那么同时手机的性能再进一步加强。那么部署到手机上也是完全有可能。好,最后总结一下吧。首先。
这个raku提出了几种关键的改进策略。首先是实现了线性注意力的RNN,使得它的复杂度呢从T方降低到了T。实现了高效的并行训练和高效的创新推理。然后还有一些更好的初始化方法啊,这个没有讲。啊。
但其实在论文里面是有的,就是。大家可以去啊看一下,感兴趣的话,例如说一生叫啊small embedding initiation就是把传统的呃。参数初始化的维持度啊,又下降了2到3个数量级。
这样的话模型收练初期收练会更快啊。这都是反正我觉得论文里面其实宝藏很多了,都是彭博和大家长时间实验得到的一些珍宝吧。希望你能够从里面发现一些有价值的东西。
好,然后就是raQ5的局限性啊,这一点我们也毫不避讳它本身的局限性。因为他的这种RN的架构其实限制了他的回望能力,就是说他必须还是说他没有办法重新得到之前已经丢弃掉的那些信息,对吧?
他只能通过一些记忆或者压缩的方式,把之前的信息保留保留在这个模型里面。如果这个模型它真的很需要非常细节的回忆,就要非要需要回忆非常细节的内容,那么可能如果模型在之开始对它的重要性判断错误的话。
那可能就没有完整的保留下来。当他传递到后面的话,可能就忘了啊。从这点上来讲。和完全的自注意力机制相比呢,机制上是存在一定的限制的。啊,但是就像我们说的,因为你要保证完全的自注意机制。
你就必须把之前所有的上下文都带着计算。那这个计算的成本是非常高的那我觉得大家可能需要做一个权衡的。你真的觉在你的业务上,或者在你需要做的事情上有这么重要吗?
还是说用我们reku的方法就可以很好的解决你的业务了。那么你这个时候也许不需要保留所有之前的信息,那也就不需要用传统的transformer架构了。另外一点呢。
其实我们发现racco其实对prom engineering更加敏感了。呃,就像我之前说的,因为回望的机制,使得说那么你一开始可能就是更需要告诉他一些任务相关的重要的东西啊,他通过这些信息。
他才能更好的帮助后面的模型进行预测。所以精心设计pro的更加重要啊。你会发现,如果这个pro设计不好,它的性能可能就不好。但是他如果pro设计的呃好一些,马上他就可以和同等尺度的transformer。
性能基本上就是一模一样的。好,然后最后说一下未来的改进方向吧。啊,一个的话是。并行扫描。这个的话可以使得它的这个计算成本进一步降低到loglog t啊,这个的话我觉得也是很有价值的。
就是说是那你T如果很长1天01万10万,那对于log T而言,那这个就非常快了,对吧?就不只是OT了,到时候就整个就是logT的一个计算度长度的话就非常好。
另外的话用于这种呃encoder decoder架构。现在reco的话,它还只能用于deder架构。然后是对它的一些上下文的可解释性、可预测性和安全性啊,就是之前看到的那个可视化的一些东西。啊。
最后的话是经再引入一些高效微调的方法,使得再用很少的呃机器,或者说就很少的数据就可以高效的精调软客户模式。好的,这就是我今天给大家分享的内容。欢迎大家提问。呃,好,我看到我已经看到一些问题了啊嗯。😊。
第一个问题是为什么叫做RNN,而不是transformer的改进版。首先叫做RN是因为它确实有1个RN运行的模式,大多数的transformer是没有这样的运行模式的啊。
所以说我们把它叫做重新发明了RN。但它其实上也是transform的改进版啊,大家可以看到呃呃哎我的这个屏幕有问题。
它的改进的路径非常明确啊,这一页上面已经谈到了它的改进路径了,就是说它是从他是从attention free transformer这个上面来改进的。其实上它也是一种线性的注意力机制。
他其实是从transformer发展过来的。啊,所以说你也可以把它称作一种transformer吧。但是我们觉得它更有趣的卖点就在于它的RN运行模式,使得它可以高效的解码。
这是其他所有传统的transformer做不到的。
RWKV异质化路线-大模型的道与术 - P1:RWKV异质化路线-大模型得道与术 - 吉尔的电影之旅 - BV1Y64y1E7Jk
呃,团队成员。然后今天我的题目是这个RWQV的一制化路线。啊,其实听到一直化路线,大家都可能这个想到PSplay stationation和space。
啊,那么就是我们来说一下这个RWKV的由来。RWKV是一个新的。
呃,大原模型的技术架构。啊,它是一个全球唯一的RN base的这个语言模型。啊,它是一个不同于transformer的一个不同的技术架构,它也是一个生态,也是一个技术社区。
这里面蕴含了这个作者以及社区彭博在这个三年之中,我们做的这些工作的努力啊,各位可以去关注一下这个呃RWKV点com可以看一下一些技术细节啊。那么其实RWKV的由来,它主要来源于两个啊有几个其实有不少。
但是我觉得我的理解是有几个初衷啊,它是首先它是需要像人脑一样思考,怎么通过transformer或者说呃就是之前是transformer,然后现在是RWKV就是这些架构来表达这个大脑的这个结构啊。
这是第一个初衷。第二个初衷是啊那么。呃,我们可以看到transformer它已经是一个。啊,模拟这个大脑的一部分能力的这么一个结构啊,我们认为它海马体,它有很强的记忆能力。我们都知道。
但是这时候我们仍然需要一个state啊,需要长城记忆,需要planning啊,需要去这个呃把这个信息抽取压缩抽象。然后刚才子源老师也讲到很多关于认知的理解。那么RWKV是认为首先宇宙是连续的。
是一个state一个state的变换。那么啊我们希望通过这个state来去寻找一个答案啊,那么这是RWK初众。在这个基础之上,我们演变出了很多的这个差别,以及这个和和传送的这个区别,后面我会提到。啊。
那就是刚说到这个架构的这就是我们是做这个架构的,跟各位同学就是有做架构,也有做这个数据,然后有做各种各样的分析的啊。那么啊之前也听了不少。那么V就是我们的WK在三年之中。
它是从从transformer到CNN到R就是他从RN在演变的过程中,它实际上是一个有一个就是有一个基本的思考方式。
就是说我怎么去重新去把这个这个transformer的结构再去演化到这个R就是我们要的这个结这个结构里面你可以看到第一个图右边是我们的V4版本啊,现在市面上的论文是V4的版本啊。
社区里面引到V5和V6了。那V4版本这个结构很像这个TMTM核心的这个回路,就是上下的这个回路。如果大家熟悉的话,它是被这个 shift的替代的。也就是这个。结构啊,首先它是非常像RN的结构。
同时它这个tken shift实际上是1个CNN的结构。我们可以理解这个无线上下文的这个state呃,就是RN的这个外推的这个天然性。是远强于这个transformer的。
当然我们不能说他的记忆力是远强于transformer的。之前吕欣老师也分享过。啊,但是就是它的这个state,我可以无限外推。但我训练过程中,这个state选择记忆什么,选择压缩什么。
实际上是一种啊是对这个信息压缩的一种抽象抽象理解啊,这个是RWKV的一个完全意制化的路线。这里这三张图实际上呃比较复杂,看起来很多结构。实际上是说我们从最左边到右边是V4V5V6版本的不断迭代。
不断迭代。那我们既然是针对一个state去不断的操作它和理解它。我们认为state是一个接近大脑的一个东西,或者是一个记忆体,或者是一个信息压缩的能力,或者是一个planning的能力。
那么我们的state在V4到V5的时候,它是在扩展的。就是不断变大的,我要变怎么变大这个state,这个这个很直接,但变大的过程就是需要很多tck和这个技巧。那到VV5到V6。
那么我如何选择变大的s记忆什么?或者说我怎么让它增强它的泛化和抽象能力啊,这是这个V6做的事情啊,它是data啊dependent啊。
我的dey是我的这个啊我的这个state是依赖于当前的data输入的。啊,这些细节都可以在我们的这个官网以及我们的技术社区里面找到,可以去知乎上面搜这个一些文章。那说到这个大家可能在V4版本之前。
就是RWK都有一个鲜艳的认知,认为RWKV它的唉这是一个linear的这是个线性的transformer啊,它这个性能肯定还是有差距的。毕竟复杂度不够,实际上到V5的时候,这个复杂度已经起来。
我们不能说V4的复杂度不够,它的能力就不够。因为我们跟transformer是做的不同的任务。啊,transformer它是一个就是先回到这个问题啊,V5版本的这个ch mark我们可以看到1。
5就是这几张图最上面那张图1。5B的这个这个这个RWKV已经是一个ta的水平了。然后V7的呃就是这个V5的7B的模型也已经啊接近拉满2的水平。啊,你可以想见一个开源模型。
它并没有什么专有数据SFT数据的时候,数据这个可能还是完全是依赖开源的时候能做到这个水平啊,我们现在不能直接去打榜,但实际上也已经证明了底座的能力。在V5,这还只是V5的能力。嗯。
所以说我们在谈到这个RWK它的性它的优势的时候,我们一般不会单单说它的这个性能优势,毕竟它是一个呃当然就天然的一个state。
那我的推理性能是ON的跟这个跟这个transer这个欧方这个显存消耗的完全不一样的水平啊,那么在这个多模态的就我说就后面我会讲一些这个RWK的差异和呃一些优势。那么在差异上面来说,其实就很自然。
在多模态就非常的自然啊,那刚才之前的这个多模态基本上都讲到这个lava这个还有这个呃这个赋余。那在RWK这边是一个呃state啊,而这这个state它有这个天然的信息压缩能力,它有这个RN的序列化能。
可以理解在这个我们怎么去让多模态的信息接入到这个t里面有大量的工作,可以去这个可以去啊探索,而且有很多非常有就是就是transformer本身有局限的地方啊,会是RN的,就是RWKV的点。
下面有就是这个这下面有一个呃viualWKV是我们现在开源的一个项目地址。大家可以去getub上搜一下。然后这个呃右边啊大家可以先看一下,这个是我们的音乐模型。在端上面跑的这个是在红米上跑的。呃。
这个能听到吗?OK那这是生成。OK刚才听不到,可能我再放一遍。🎼啊,这是一个乐谱的纯续写模型,前面是乐谱的这个prot,后面是乐谱的生成的结果。🎼呃,当然你也可以去选择呃手动输入乐谱,然后让模型能够。
🎼根据你任意输入进行无限的商城。🎼啊,这是很简单的,后面我会就还有mii模型。那左边这个图是指的是这个呃我们在mac pro上面跑的这个AI小镇。AI小镇实际上是AIMPC。我们因为是state。
我的state切换是没有性能消耗的。那么我跑了200多个agent,同时在这个小镇里面进行交互。啊,是一个啊天然的优势啊。这是一个mii模型RWK runner就是在社区里面。
我们会有这样的本地化的项目。RWK runner啊,可以去啊对话,可以去微调,可以进行这个mii音乐的这个的创作。啊,这是基于RWKV的一个项目。
它可以让1个500兆显存的这个极显的这个这个laptop,就是这个笔记本可以跑这个PDF的cha。啊,就是这个这个PDF大概是一呃呃一两兆的样子吧。它实际上是我只训练了16K的模型。
但实际上它外推到200K左。啊,就其实回到之前的长长模型的能力上面来说,当然大好捞针对我们来说是一个有点不公平的项目,不控的任务。但是我们其实可以在里面加attention。RW可也可以去改架构去。
往里面增加attention,然后去提到提升这个memo,就是这个记忆。嗯,说到这个这个差异,就是呃模型就阿WKV和trans的差异,就是这个state本身代表了什么含义?
它实际上是一种信息压缩和这种语言的一些呃特征的。抽象能力,这里是一个小说的例子,右边是GPT4的模型,这模型小说的续写,左边是这个RWK的模型啊,那这个RNA模型。
或者说我们认为state模型它有个天然的这个优势在于这个信息的捕捉能力啊,我对这个信息的抽象以及信息的这个风语言的风格的捕捉,让这个作者能够很好的去续写,符合他语言风格的能力。啊。
这个是我们在社区里面经常会看到的例子啊,就是也是基于runner去使用的一个小说模型。啊,这是一个多人对话,多人对话也基本上是跟刚才的AI小镇是非常相似的啊。
多人对话这一点在于说啊这个项目在于说它实际上是一个啊模型编辑的结果,就是它是通过多种模型的编辑之前。啊,刚有位老师提到这个模型编辑来增强某些能力啊,比如说他为了让角色扮演能力很强。
我们在attention和FFFNN这个模块上面进行编辑和融合之后,他的这个猫娘的自我认知能力更强一些啊,然后呃这个角色扮演更贴合一些。这是一个这个呃这也是个很有趣的项目。
它是完全基于RWKV57B的模型啊,就是在本地做了一个rug助手rag它核心需要一个inbedding,还需要一个数据库,还需要一个本地推理模型。那这这个这个inbedding的模型推理模型啊。
以及这个呃中间的这个查询的模型都是用7B一个模型做到的。它是用了laura的方法,做把这个7B的模型变成了一个embedding模型啊,因为它存在一个statestate某种变相的意义上面。
它做lara做做这个模型改造之后,可以变成一个7B大小的embedding模型。啊,从头到尾就是呃RWKAE间扛,就是这样stateate模型能够呃既把这个inbeing模型做了,也能做推理模型。
然后也能做这个查询的模型。把这些这个呃呃就是完成了这个contest,就这个rug的任务啊。这个在这公众号各位可以搜一搜这个啊7BLMRug这个个人助手也是能看到的。啊,这个项目也开源了。呃。
提到这个开源就是社区里面的一个项,就是这关于这个模型的大小的这个就是各位对这个RWKV模型肯定还有scale这样的东西非常的怀疑。比如说200B100B的模型会怎么样啊。
社区里面就是通过这个迁移学习啊后预训练这个优化。然后有各种tck,然后把这个12B的模型做出来了啊,当然这个12B模型并不是这个啊本身出于这个RWKV来做的,就是这官方团队来做的。社区做的啊。
它的训练呢还不是很充分。但是后续在这部分来说,大家可以可明确的看到啊,因为这个RWKV模型的架构,它在不断的升级啊,在预训练层面上面。
我们在模型升级的同时还能保就是提升这个训练效率会极大的加速这个更大模型的落地啊,所有人都喊着说我们要1个60B100B的。模型我觉得这个这个我们会很快就有,而且大家可以很快能用上。啊。
这个是社区的一些这个介绍啊,我们有disco,也有这些项目相关的项目。很有意思的地方是这个RWKV的模型,它是中国人自己研发的创新的啊,我们不管怎么说它的起点是这个这个AFT或者怎么样。
但是在后面啊不断的这个架构升级过程中,呃,是我们作为这个开源社区的一个非常重大的贡献啊,就在我们在跟随拉嘛同时,也是我们在贡献也也也从RWKV这角度,我们在贡献这个开源的这个项目。呃。
后面我会讲一些这个除了这个模型本身,也会讲到这个模型的这个talkne这一个我们的为什么要选择我们自己的talkneer啊,因为这个这个GPT各位都知道,这个对中文很不友好。
我在一个很有限的contest里面,如果这个这个用中文的话,三四个字才能它就就是一个字代表三四个taken,它就非常低效。英文才是1。5啊,这个RWKV啊啊对,对有一些语言来说。
7个字符就有6个talk。
对RWKV来说,它是一个wordtaken,对任何语言都是一。5的taken的这个公平的这么一个状态。所以说作为多语言来说,RWKV也是一个很好的起点。
啊,这是一个呃嗯这个性能消耗的一个例子啊,每模型推理的这个交消耗产比这个是很这个是很直观的。因为我们是一个state,它的性能比这个是天然优势啊。就是啊就是之前的一个日语的榜单。好,这里我说一下。
就说刚才我们之前这个吕行老师也提到了长文本模型。那么长文模型里面这个复杂度来说呃,这个呃我们是N的啊,这个transformer是N方最下面transformer。但RWKV它不是现在不是一一个。
而是有多个啊,有这个runnet有man板啊,这还没有说到这个man板啊,这个时候还没出man板RWKV。对呃呃这个这个带来的这个就是很这是很朴素的优势。对。啊,这是一些相关的呃外国的一些报道。呃。
这里我想说一下,就是嗯说到这个信息的压缩之后,大家都会怀疑说我在大海捞针这个项目,如果纯天然的RWKV,它到底有没有这个记忆能力,记忆能力足够是否足够强啊,我们做了试验。这个V5的1。
5B的这个re这个size加概是11900。那么我们估计14B左右在18000。那其实呃我们就是你就是因为各位我们在开源社区里面没有特别好的数据,直接能SFT或者我们用的很多都是开源的数据啊。
各位如果在做不同的transformer模型的同学或者老师可以去试用你们的模型数据直接来训RWKV的模型。因为底模型是没有,就是底模型啊训练的方式还跟传统模型。
就跟transtransformer也不一样啊,它是非常这个呃我理解是非常包容这个不同结构和这个这个格式的你们可以任意。构造自己的数据集和能力去训练模型,它也能就是在这个基础之上去做不同的任务啊。
会有很大呃就是会有非常非常多的可能性。哦,谢谢大家。这个不是我们希望达到的这个目标,100B还不是节点。我们希望后面有200B的模型,而且在一个很低的性能消耗下面来做啊,这个呃共同大家共同努力。好。
谢谢大家。😊。
Talk | 新加坡国立大学博士侯皓文:RWKV论文解读 - 在Transformer时代重塑RNN - P1 - TechBeat人工智能社区 - BV1wu411j7WF
降门的朋友们,大家晚上好。受降门的邀请,我来和大家介绍一个新型的大语言模型架构raku啊,他不读RWKB读raku。好,那咱们今天就开始吧。首先呢介绍一下核心卖点,毕竟大家现在时间都很宝贵。
先听我说一说核心卖点怎么样,能不能吸引你。嗯,首先呢。raku最大的卖点在于OE的推理复杂度是真的非常像啊。单token的推理时间恒定,随着token增加。序列长度增加,线性增加,总推理时间。
内存占用恒定不随序列增长增加。无论你的上下文有多长,它的内存占用都是不变的这是一个很好的特性推理时间和内存占用随模型尺寸线性增长线性增长。啊我们可以看到其他的一些。标准transformer的模型。
他们随模型尺寸都是咻就起飞了。就就起飞了啊,可以见模型越大吧客户相对于他们的优势越大,这就意味着大语模型的硬件成本和部署成本将大幅降低。服务器上部署大模型成本降低,普通台式机和笔记本也将可以部署大模型。
而未来手机上部署大模型也成为了可能。所以我们认为reco将会推动大模型进行一次架构迁移。从传统的transformer架构向具有线性注意力的新型架构,如reco类型的模型迁移。好。
我们先来介绍一下传统的RNN和transformer有什么样的一些局限性吧。首先这个传统的RNN呢,首先有梯度消失的问题。所以后面提出了LSTM一系列的模型来。缓解这样的梯度消失问题。
但其实缓解的也不是很好嘛。然后第二个RNN在训练过程中无法在时间维度上并行化,这极大的限制着其可扩展性啊,这就使得RN模型在之前没有办法充分的利用GPU资源进行训练。
使得它的模型规模一直没有办法很快的扩大。然后transform有什么问题呢?transform的问题在于它具有二次的线性复杂度啊,不叫线对不叫线性,就是二次的注意力机制复杂复杂度。
使得它在长序列任务中的计算成本很高,内存占用很多。而raku模型呢,它拥有ODOT的时间复杂度和OD的空间复杂度。OD在这里其实是一个常数,就是模型的维度啊。
所以说可以也可以把它说是一种OD的空间复杂度。所以。我们。这次主要介绍的就是raco的网络架构,它结合了RN和transformer的优点,同时缓解了他们已知的一些限制。这是一种新型的线性注意力机制。
而且我们在后面会展示raco强大的大强大的长距离依赖关系任务时的性能效率和可扩展能力。OK那我们下面来讲一讲RN是什么样的一个结构。最简单的RN呢可以写成这样一个形式。这是输入的文本。
一个字或者一个词是他之前的一个状态。新的一个状态呢等于。之前的状态的一些。你可以说是遗万或者记忆都可以。然后一减掉这个一万或者激励的一个比率,把这两个信息进行一个线性加权融合。
然后RN总是这样一步又一步的向前进行的啊,我们可以从左往右一步输入一个词或者一个字,一步一步的向前。那优点呢是它内存占用小,计算量小,但缺点在于每一步都依赖前一步的结果,使得它没有办法并行化的训练。
这极大的限制了RN的可扩展性。而transformer呢一次是。处理一整句话甚至一整段话,那它的处理效率就非常高,可以很还可以轻松的进行并行训练。OK然后我们来看看这个transformer。
它的二次注意力机制是什么意思。呃,这是传统的transformer架构,可以理解为它需要一个矩阵Q和一个矩证K进行相乘。而这个矩阵和矩线的相乘呢就是一个二次复杂度的事情。
而为了改进这一点呢呃苹果之前有篇论文叫做tention free transformer提出了一种线性的注意力。这种线性的注意力呢取代了Q乘以K这两项,而是用一个固定大小的。W权重加上一个调至当前词。
重要性的全呃向量K这两个组合来计算模型的这个注意力机制啊。受这个AFT的启发。raku在每个词中其实也专门设计了一个W向量。但这个向量和AFT中不一样的在于它是一个随时间衰减的向量。
这个地方可以理解为T是当前的token,然后I是之前的token,通过计算当前token和之前token的一个距离,然后乘以它的W。那么来得到一个线性时间上衰减的注意力啊,它可以是-3-4-5-6啊。
那这样的一个注意力来使得raku可以把信息从很远的过去,通过一种指数加权平均的方式带到现在来。好,那么下面来谈一谈raku这四个字母的含义是什么呃,raku的R代表接受程度。W呢代表位置衰减权重。
就是刚刚。那个公式里面的WK呢是见向量,同时在我们可以理解为就是它对当前token的一个。重要性啊到一个标准。V应呢是直向量。类似于传统助力机中制传统激励助力机制中的V。好。
我们先从整体上看一下这个架构吧。啊。首先当一个词或者一个字进来之后,经过一个lay norm之后呢,会首先对这个这段话进行一个time mixing啊,这个后面会讲到,然后呢。对它进行一个输出。
这个输出呢其实也使用了跳脸的方式,把之前输入的信息啊,通过这个方式在后面和模块输出的信息做了一个加权融合啊,做了一个融合。
然后输入输出到输入到这个channel mixing的模块中啊channel mixing呢主要是为了使得通道之间进行一个混合。然后模型得到更强的非线性。好。那我们讲一下呃。
time mixing模块是什么样子的。啊,它mixing模块的核心的公式就在这里。大家可以用大家可以看一下右边这个图啊,我觉得这个右边这个图相对还更容易理解一些。首先。
EW是一个根据位置衰减的呃向量啊。然后他在不同的布场的时候,会有一个不不是布长,它在不同的位置会有不同的值。第一步,当我们把我们的词这个字输入进来的时候,它会和当前这个它的。EW向量进行相乘。
得到一个权重,或者得到一个注意力,两个融合得到所需要的啊inbedding。然后我们把词往。往前走一步,这时候看到的是第二个字或者第二个词,这个时候呢又会对它进行一个加权融合。
这个举这个都是通过啊点对点的。乘法来完成的,然后得到第二个词位置的向量。然后我们再往前走一步,得到第三个位置的词和第四个位置子的词的向量。最终呢我们就通过这种方式把过去的信息。
和现在当前词的信息融合到了一起。🎼所以RWKVraku在不引入二次复杂度的情况下啊,扮演了transformer中QKV的这个attention的这样的一个机制,只不过它是纯线性的。好。
在经过了time mixing之后呢,模型会进入channel mixing模块。channel mixing模块呢啊可以理解为就是给模型增强它的非线性而设计的。
而且这个地方要特别的指出channel mixing过程中啊,有两项,一项是XT减1和XTXT呢是当前的输入tokenXT减一呢是前一步输入token。
这是通过一个token shift这种机制来完成的,相当于是说对于每一步。我们把当前部和前一步的token一起输入进来,让模型看到,这其实上就增加了模成模型对啊这个序列信息的建模能力。
然后这个呃signoidRT和这个。嗯,square路啊都是为了增强模型的这个非线性。这个地方呢我还要再提一句,这个token shift啊是有什么样的价值,或者说是它是怎么来增强这个模型的呃。
序列建模能力的。哦,我们可以首先看第一个第一个字,第一个字输入进来的话,他就只能看到他自己。但当我们输入第二个字name的时候,它有一条路径,可以通过自己看到当前输入的token。
同时可以通过这个token shift的机制,看到前一个输入的token啊。此时那么对于模型而言,它的感受也就是R。当到is的时候呢,模型可以通过token shift在这这一层看到它自己。
通过token shift看到它前一个词,而在上上再再上一层,它可以通过token shift看到前一个词,并且通过这样一条路径看到前面两个字。通过这样的偷工 shift的操作呢。
使得模型具有了更大的感受也。而且我们可以看到,随着模型的层数增加,它的感受也是不断扩大的。我们可以说对于100层的模型,它其实真实的感受也是100。
在当前这个token它其实是可以看到这个token前面100个字的信息的。所以通过这样的设计,使得模型具有了更好的序列建模能力。啊。因为roku是高度并行化的。
所以说它可以像transformer一样的训练,然后它。的这个时间复杂度在训练过程中仅仅是BT的地方,而且QWKV依靠串新扫描的复杂度呢,可以实现到OBTD啊。好,那下面说说reccod的另外一个优势。
就是它可以像RNN一样解码。我们可以把red的这个。形式写成一个递归的形式。呃,WKV这个。注意力啊,其实呢我们可以把它之前的项写作ATT减一和BT减1。这两个项呢可以通过之前的项进行。计算得到啊。
所以说我们每一步进来都可以只需要两个量,一个量是当前的输入,一个量是token。啊,不是投ken,一个量是当前的输入,一个量是前一个模前一步模型输出的state。通过这两个。东西我们就可以计算下一步。
而不需要再去像传统的transformer去。把所有之前的那些token都计算一遍啊,所以使得raku具有很高的推理性能。对于这一点啊,后面。我还会专门用代码啊给大家展示一下。
就是怎么怎么一步一步的从标准的transformer改造成reco的并行结构,再把并行结构改造成reku的这种啊。递归形式或者说叫做循环形式。如果感兴趣的话,可以在这个PPT讲完之后。
我会专门再讲一个我自己写的呃notebook啊,里面可能会更清楚的让你看清楚这些这个raku是怎么做这个计算的。好,下面的话就展示一些关键结果。呃,首先的话raq中有3种。机制来够表示能够捕捉序列信息。
嗯,传统的LSTM对于它而言,它差不多在100个token左右的时候,模型的los就不再下降了,说明模型已经开始遗忘他之前看到的信息。而对于raku,我们使用了三种机三种机制啊,一个是循环。
这个循环就是它的RN形式,通过时间部的。方式传把信息传递下去啊,通过这种方式。来捕捉序列中的复杂关系。第二个呢就是time。a mixixing或者说time decay之前也讲过了时间衰减。
通过这种EMA的方式,把过去的信息带到现在,并且隐视的引入了位置信息。那第三种呢是token shift啊,一种理解呢是可以理解为它是bigram啊,强行的版。当前的字和前面的是组合到一起。
然后另外一种理解呢,就是像我说的是一种CNN的。呃,感受一。使得。模型层数越高的地方,它可以看到更长的信息。这三种机制结合到一起,使我们能够在4096,这里是4096的地方看到老客户在训练过程中。
它的los还在下架,说明模型可以捕捉长程序列中的信息。好,下面是一些可视化的事情。呃,一个是这个时间时间衰减的可视化。我们可以看到在不同层中,它时间衰减其实是很不同的嗯。首先第一层我们可以看到。
其实上基本上呃这个channel中很大一部分都衰减到接近0了。那说明在这些channel中,其实模型仅仅是关注它当前的token,它并不想关注太多之前的token。但随着这个呃模型层数的上升。
你可以看到这个模型它关注的信息的长度越来越长。在相当大一个平台里,这些层的模型它都是保持一个非常高的衰减,非常低的衰减系数。意思是说,它会把信息全部记住。前面那些重要信息全部记下来。然后不断的往后传递。
像这样的话,使得模型能够记住很长的信息。第二个例子呢是使用因果追踪的方法来展示信息的传递路径。呃,我们这个时候给的例子是the埃ffer tower is located in Parisis。
答案是par。我们看预测出paris的过程中,模型的信息是如何传递的。其实我们可以看到,当模型看到埃ffer铁塔的时候,它就把系信息给记下来了,同时把它给它啊储存到这个20层左右的位置。
然后随着这个信息序列不断的往下走,这信息其实一直是存在这个地方的,它就不断的往下走。然后等到off的时候,木型知道okK这个时候是需要输出paris了。
他在把模型的信息这样传递到最终要输出的token位置。啊,所以说这个图清晰的展示了。Q模型是如何?来传递他的信息的。好,然后到了下一个很重要的就是评估环节。然后。
这个评估环节呢对比了ra库伯和很多传统经典的transformer架构之间的结果。可以看到ra客在很很多模型,ra客模型在很多评测数据上啊,随着。它的参数量增大,它快速的接近transformer。呃。
例如这个在这个lammbda这个数据集上,一开始raku模型其实和其他的trans模型还是有一些差距的。但当它达到呃3B左右的时候,它的已经快速接近了其他的模型。当它达到呃7B的时候,14B的时候。
它其实已经和经典的transformer模型不相上下了。从这个角度上说,raku模型其实是一个更适合。呃,更适合可扩展性。它scalability更强啊的这么一个模型,它受参数增加的收益是更大的啊。
从这一点上来讲,其实我们非常看好一个大参数的raku模型。由于它很好的这种啊具有这种RNN推理的性质,我们可以在一些设备上用更大的参数的模型来来运行我们的任务。那它需要甚至可能会好于。
transformer因为在当在那个情况下,transformer只能用更小的模型来部署。而raccku模型在那个情况下是可以部署更大的参数啊,从这个角度上说,可能因为raku参数更多。
还会有更好的效果。好,然后下一步又是我们的核心卖点之一呃,推理复杂度。在生成T序列的这个长度,长度为T的序列的过程中,可以看到真正的这个累积时间,累积时间啊,累积时间,raku一直都是一个线性增长的。
而其他的这些transform模型都是数二次增二次增长的。在1000个token的时候,其实差不多可以看出呃是60秒和10秒的差距。从这个时候这个时候可以看出raku在性能上有6倍的这种提升啊。好。
然后再展示一些我们在一些端测上的一些结果吧,或者说在一些其他呃就是其一些呃其他的一些推理的结果呃,CPU上现在其实已经支持了int4int5到int8的高速运行。然后特别推荐in8模式。
因为in8模式其实它的lo损失很小。然后同时呢可以呃letten C也很小啊,只有89毫秒。然后模型的大小呢只有2。13B,所以的话这个其实是已经可能可以部署到很多的设备上了啊。
因为它可以在CPU上部署,所以说它的成本就很低啊。相比你如果要使用A100或者A6000会便宜很多。然后raku大模型的端测能力啊,这里我呢展示了raku模型在很多其他的一些呃平台上的这个部署的情况。
例如在CPU上,16G的内存就可以运行70亿参数的raku模型。12GB的模型可呃12GB内存可以运行8T呃in8的70亿参数的模型。而且我们发现这个如果新的CPU支持BF16,那么速度还会更快。
在GPU上,15G的显存可以运行70亿的参数。9GB的显存可以运行呃in8的70亿的参数。好,那么总结一下吧,就是raco提出了一系列的关键。改进和策略。使得它可以捕捉。局部性和长城依赖关系啊。
并通过以下方式解决了当前架构局限性。首先实现了线性注意力的RNN。将计算复杂度中transformer的T方降低为OT。实现了高效的并行训练和高效的创新推理。实现了一些更好初始化方法啊。
这个其实在PPT里没有讲,感兴趣的同学可以去论文里面看。其实我们在raku的训练过程中,还是发现了很多初始化方面有很有趣的结论的。然后raku的一些限制呢。
首先我们也坦诚raku的架构和或者它的这种学习方式,其实是限制了他的一些在上下文中回忆细节的能力的啊。因为它必须的循环结构,使得它其实上没有办法,那么就它没有现显示的保留之前计算的各种结果。
或者说之前的记忆。而是之而是就所以像这样的话,就限制了其回望之前信息的能力。这和完全的自注注意力机制相比呢,机制上是存是存在一定的限制啊,但这个其实是一种吹 off。如果你要保存之前所有的机忆。
那么必然会使得模型的计算量非常巨大,内存的占有量也非常巨大。呃,第二点呢是说这raco的这个pro engineering的重要性增加了。因为我们发现racco模型对promp的更更加敏感啊。
精心设计prot会使得ra code的性能可能有成倍的提升。然后我们觉得和transformer相比是更加敏感的。就是说可能需要设计呃pro的时候要更加注意一些。好。
那未来这些工作呢啊一个是说进行变形扫描啊,使得抓库的计算。成本从。现在的BTD降降低到B lock TD啊,这样的话可以进一步的提高ra库在一些超长序列上的计算能力。呃。
然后呢把roQ用到些encoder和decodeder架构里面。为reco增加很多能力啊,例如说这种多模态的能力,例如说一些呃retrival enhance能力啊。
同时呢还可以针对retrirere的状态,做一些数据可解释性呀、可预测性和安全性的研究啊,这些都是非常有前景的。好的,那这个PPT就到这个。就讲到这儿了啊。
下面呢我会给我会给大家啊用展示一个notebook,用代码的形式来展示一些raku最核心的。最最最核心的。呃,理念或者说是思想啊。好,让我们去看代码吧。好的。
下面呢我们来用代码解释一下各种模型的tenion是什么样子的。
首先呢我们先来介绍一下transform attention向量版。这个和大家平时看到矩阵版是不同的。可以看到这个。公式里它是首先计算Q和K的一个分数,然后再通过指数进行一下变换,再乘以VI,然后求和。
最后除以一个规划因子。就可以得到呃attention的。就可以得到transformer的ten。用代码来解释的话,可以看下面这个代码。首先呢我们初始化一个输出。
这个输出呢是由序列长度T和模型维度D所决定的。然后我们开始从第一个字或者第一个词,第一个token开始。我们先算一个当前token的硅化因子初始化一下。
然后初始化一个当前这个token的要输出的tenion。然后呢,我们就开始沿着第一个ttion开始往后逐步的便利啊,attention呢等于。对应的QT就是当前的。
token它的作为cory和后面一个token之间的啊这么一个。内积分数,然后取一个。指数都得到它的ten性分数是ten线分数呢再乘以后面的对应的那个token的。呃,value向量。
加到一起就可以得到后面的这个OT。同时,它规划因子也不断的积累了tenstion。最后呢。OT再除以一下Z就可以得到我们要输出的。我摊身了。从这个地方一个不严谨的说啊。啊,不严谨的时候。
你可以看到它其实是。两个循环啊,那么最简单的算法分析里面,两个循环就是ON方,或者说这里说是OT方的一个复杂度。对吧。好,让我们看一下这个计算结果和标准的selft一样吗?你会发现它是一样的啊。
当是标准的selft计算是矩证版它就更简单了。Q的整个矩阵和K的矩阵转置一下,得到一tention score。然这个ten score再和V做下聚合。
就得到我们标准的self attentiontion的结果,我们可以看到aser它是一模一样的。所以说明我们向量版的attention啊,可以计算和矩阵版一样的结果,那可能观众就要问。
那为什么我们要计算向量版的,明显的向量版好像效率很低呀。是,但是把attention转化成向量版,我们更容易看清楚后面的一系列眼镜和变化的。最初的模样。后面苹果就提出了。
attention free transformer的线性attention。我们可以再看一看这个是什么样子呢?他把之前的Q和K取消了,转而代之的取而代之的是W和K,这是什么意思呢?
我们还是从代码上来看一看,我觉得更容易理解。首先。W在。attention free transformer里面呢被定义为一个T乘T的矩阵。这个呢它代表的是点和点之间的位置的biers。
或者说位置的偏置项。可以理解为说我第一个词和第二个词之前就有个固定的偏执。我第零个字和第三个字之前就有个固定的偏执。模型就是要学这样一个静态的固定的偏执。OK那么当模型开始便利。
取到第一个token的时候,我们会发现它仅仅是取到。当前token。而是一个to困之后的,他不会取到。那它的计算过程呢也是把对应的。W矩阵里面。T和I之间的这么一个位置偏置拿出来。
同时呢加上1个KIKI是可以理解为第I个token的词权证或者自权证或者token权证。把这两个是加到一起。来相当于是说近似之前的Q乘以V啊。而Q上面Q乘以K的那个点击的结果,然后再取一个指数。
就得到一个这可得到了AFT的tension。然后呢,把attention的结果加到V上面。然后把验结果和VI相乘,然后把规划因子也加上最后。除一下规划因子就可以输出得到AFT的。发现没有?像这样。
那么他其实上。就也实现了一种线的ttion,但这个tction是线性的。为什么说它是线性的呢?那其实这个地方其实我觉得看的不是很准确。就像我刚刚说为什么我刚刚说那个是。不准确的,它也是一个双重循环。
但是呢你可以看到它其实每一个tension它。不再依赖于啊其他的所有的这个成绩啊,而是说依靠这样的。你可以理为,这个就是一个查表啊,理解为一个查表,加上个当前资权重的一个加和。他就不再需要做矩证惩罚了。
那他就摆脱了其他token和他之间的这么一个限制关系。所以他就变成了一个线性的tenion。好,那我们最后再来看一下recod线性attention是什么样子的呢?其实受AFT的启发。
reco的线性attention。也使用了W和K,还有V啊,所以在recd paper里面都把这一项attention叫做WKV。好,那我们来看一下这WKV这个公式是什么意思呢?
其实作者的思想或者说我们这是论文的思想是说,我们认为啊随着这个。距离和当前token。的变化。那么其实上这个词的重要性是有一个衰减的。呃,当前token我们给了他一个buus啊。
或者说可以理解为就是一个加奖加奖。然后呢,当前token前一个token,我们把他的这个注意力的W取为0。然后再前一个token,就前两个token为-W,前三个token为-2W之后以此类推啊。
就实现了这样的一个衰减过程。然后再。那我们现在下面来去看具体的计算过程吧。首先也是从第一个token开始取。然后计算到。这个token开始,但是我们呢注意pyython它只取,它其实最终取值取不到T。
它最终I的一个只是T减1。那么可以理解为最终其实上会计算到当前token的前一个token。那么。对于前一个token,我们怎么计算它的这个attention呢?使用W。响亮成语当前。成语,当前T和。
当前乘与当前tokenT和I之间的一个距离。啊,转化为之前看到的-W-2W-3W这样的一个形式,然后再加上。KI作一个词权重或者偷恨权重。取指数就得到了啊re。这么一个呃attention。
然后再把这个attention和V乘到一起,然后再把它加上,然后规划因子也同样加上。然后那下一步其实就有点不一样,就是说okK下一步是算一算当前token。它的这么一个attention是多少了?
我们使用了U作为它的一个奖励啊,我因为我们认为当前拓ken对于模型而言可能更重要,所以专门给了他一个奖励,用了U,然后加上。KT就是当前token的权重给了它指数,然后再加上最后就可以计算出了弹了。当。
像这样做的话,就实现了我们之前所说的,随以时间衰减的这样的一个规律。然后它具体的公式是这样的。啊,但是其实像这样的话,我们会发现他好像。呃。计算起来还是不快啊。
它所有的他所有的这个值还是需要依赖全面的这些所有再便利一遍,对吧?它计算效率还是不好。那其实我们会发现在这个公式里啊,它前面这一部分。和下面这一部分其实可以用另外一个因子给它记录下来的。
只需要把这个当做一个state。每次计算的时候,把它们输入进来,再和当前的这个token的这一系列的向量进行一个计算,就可以得到WKV了。所以我们其实上不需要把所有之前的值重新算一遍的。
而是在当前的话把。当前的把之前的纸啊放到一个cash里面,你可以把它叫做cash,也可以把它叫做state。然后再和当前的这个通分来计算,这样的话呢计算效率就可以大幅提高。所以我们来看一下。
raku的RN版本递归形式,其实就是利用了这样一个思想。把之前的所有的那些求和项啊记为AT减1。规划因子里的聚合项即为BT减1。然后呢,我们通过一定的推导。就可以发现啊,其实找客户第一个项就是V0。啊。
因为这个时候你可以认为它的tention就是一嘛。然后A和B可以初始化成这样。因为。因为它就是现在我们要呃OK然后从第一个token开始便利。然后我们把A。和B要加进去,同时自算当前这个token的。
值和它的buus,然后再乘上它对应的valueue。就可以得到。当前的tenstion,然后呢再更新一下,再更新一下我们的A和B。用这样的一个共式根线A和B,感兴趣的观众可以自己去推导啊。
这个其实推导过程并不并不复杂。然后我们就得到了我们的tension。那你会发现其实它计算结果和前面计算结果是一模一样的啊,说明我们这样的一个化解是正确的。但是其实这样做还有一个问题就是数值不稳定。因为。
X呃指数K其实是很容易溢出的,特别是在flow16的时候,它最大的数值只有65504啊,大家可以取个log,大概也就十几的样子。如果K大于十几,它整个值就溢出了。所以训练时呢,我们还需要做一个改造。
其实这个改造说简单也挺简单的,就是每一次我们在求ESP之前,要先把它的值减到一个最大值减掉这个最大值之后呢,就把EXP这个值压到了零和负数之间啊,像这样的它就不会溢出了。最后呢我们再计算一下。
就得到对应的ten啊,大家可以发现,最后这个版本其实就是。就是彭博作者,他在他的开源代码里面使用的方式了啊,所以说我们一步一步的大家跟随着,我就从最原始的tenion到AFT的tenion。
再到ra客的简化版呃简单版的tenion,然后再到递归形式的tenion,最后到了数值稳定版的tenion,就知道了啊整个工作是怎么一步一步的演进到最后的这个样子的。OK那今天想说的就这么多,谢谢。😊。
观看。Yeah。